有一个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; }
你可以写你自己的迭代器。 这并不难。 迭代器只是一个类(简单来说)增量和*运算符的定义。
这是一个解决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