C++流和迭代器:为什么它只打印一次



我只是在摆弄一些流和迭代器,一切都很好,直到我尝试了下面的代码。我希望输出是逐行打印的输入文件中的所有单词。我知道我可以在ifstream上使用>>运算符,但我写这段代码只是为了更好地掌握流和迭代器。我得到的当前输出是第一行的所有单词都打印在自己的行上。

#include <iostream>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <iterator>
int main (int argc, char* argv[]) {
   if (argc < 3) {
      std::cerr << "Usage: " << argv[0] << " INPUT_FILE OUTPUT_FILE" << std::endl;
   }
   std::string line;
   std::istringstream iss;
   std::ifstream ifs;
   ifs.open(argv[1]);
   while ( getline(ifs, line) ) {
      iss.str(line);
      std::cout << iss.str(); //debug
      std::copy(std::istream_iterator<std::string>(iss),
            std::istream_iterator<std::string>(),
            std::ostream_iterator<std::string>(std::cout, "n"));
   }
   ifs.close();
   return 0;
}

重置std::istringstream:的错误标志

while ( getline(ifs, line) ) {
      iss.clear();
      iss.str(line);
      ...
}

std::copy的调用耗尽了底层缓冲区,并且std::istringstream对象处于失败状态(eofbit集)。

您应该在循环中定义iss。你需要一个新的,干净的每次通过循环:

while ( std::getline( ifs, line ) ) {
    std::istringstream iss( line );
    //  ...
}

否则,iss将保留以前使用的状态你不想要。

如果您阅读例如std::istream_iterator的引用,您会发现它使用operator>>来获取输入,而operator>>只读取空白分隔的条目。这就是为什么你把每个单词都放在不同的行上。

您将不能多次读取输入字符串流,因为一旦完成,它的EOF标志就会被设置。清除标志,或者在循环中声明字符串流对象。

   while ( getline(ifs, line) ) {
      iss.str(line);
      std::cout << iss.str(); //debug
      std::copy(std::istream_iterator<std::string>(iss),
            std::istream_iterator<std::string>(),
            std::ostream_iterator<std::string>(std::cout, "n"));
            iss.clear(); // celar the iss to reset flags
   }

相关内容

  • 没有找到相关文章

最新更新