有一个C ++迭代器,可以逐行遍历文件吗?

我想获得一个istream_iterator样式的迭代器,它将文件的每一行作为一个string而不是每个单词返回。 这可能吗?

编辑:这个相同的技巧已经由其他人在之前的线程发布 。

std::istream_iterator很容易做你想做的事情:

 namespace detail { class Line : std::string { friend std::istream & operator>>(std::istream & is, Line & line) { return std::getline(is, line); } }; } template<class OutIt> void read_lines(std::istream& is, OutIt dest) { typedef std::istream_iterator<detail::Line> InIt; std::copy(InIt(is), InIt(), dest); } int main() { std::vector<std::string> v; read_lines(std::cin, std::back_inserter(v)); return 0; } 

标准库不提供迭代器来完成这个任务(尽pipe你可以自己实现类似的东西),但是你可以简单地使用getline 函数 (而不是istream方法)来从inputstream读取整行到C ++string。

例:

 #include <iostream> #include <fstream> #include <string> #include <algorithm> using namespace std; int main() { ifstream is("test.txt"); string str; while(getline(is, str)) { cout<<str<<endl; } return 0; } 

你可以写你自己的迭代器。 这并不难。 迭代器只是一个类(简单来说)增量和*运算符的定义。

看看http://www.drdobbs.com/cpp/184401417开始写你自己的迭代器。;

这是一个解决scheme。 例子在每行的末尾用@@打印input文件。

 #include <iostream> #include <iterator> #include <fstream> #include <string> using namespace std; class line : public string {}; std::istream &operator>>(std::istream &is, line &l) { std::getline(is, l); return is; } int main() { std::ifstream inputFile("input.txt"); istream_iterator<line> begin(inputFile); istream_iterator<line> end; for(istream_iterator<line> it = begin; it != end; ++it) { cout << *it << "@@\n"; } getchar(); } 

编辑:曼努埃尔已经更快。

您可以使用istreambuf_iterator而不是istream_iterator。 它不会忽略像istream_iterator这样的控制字符。

code.cpp:

 #include <iterator> #include <iostream> #include <fstream> using namespace std; int main() { ifstream file("input.txt"); istreambuf_iterator<char> i_file(file); istreambuf_iterator<char> eof; std::string buffer; while(i_file != eof) { buffer += *i_file; if(*i_file == '\n') { std::cout << buffer; buffer.clear(); } ++i_file; } return 0; } 

input.txt中:

 ahhhh test *<-- There is a line feed here* bhhhh second test *<-- There is a line feed here* 

输出:

 ahhhh test bhhhh second test