我只是搞乱了一些流和迭代器,一切都很好,直到我尝试下面的代码。我期待输出是输入文件中逐行打印的所有单词。我知道我可以使用>> 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;
}
答案 0 :(得分:3)
重置std::istringstream
的错误标记:
while ( getline(ifs, line) ) {
iss.clear();
iss.str(line);
...
}
您对std::copy
的调用耗尽了底层缓冲区,而您的std::istringstream
对象处于失败状态(eofbit set)。
答案 1 :(得分:1)
您应该在循环中定义iss
。你需要一个新的,干净的
每次循环:
while ( std::getline( ifs, line ) ) {
std::istringstream iss( line );
// ...
}
否则,iss
保留其先前使用状态,即
你不想要。
答案 2 :(得分:0)
如果您阅读例如this reference of std::istream_iterator
您将看到它使用operator>>
来获取输入,而operator>>
只读取以空格分隔的条目。这就是为什么你在不同的行上得到每个单词。
并且您将无法多次读取输入字符串流,因为一旦完成它就会设置EOF标志。清除标志,或在循环内声明字符串流对象。
答案 3 :(得分:0)
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
}