簡體   English   中英

C ++流和迭代器:為什么只打印一次?

[英]C++ streams and iterators: Why does this only print once?

我只是在弄亂一些流和迭代器,在我嘗試下面的代碼之前,一切都很好。 我期望輸出是輸入文件中逐行打印的所有單詞。 我知道我可以在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
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM