是否有可以逐行迭代文件的C++迭代器?

the*_*use 50 c++ iterator newline file line

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

Man*_*uel 28

编辑:这同样的伎俩已经发表别人在以前的线程.

你可以很容易地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;
}
Run Code Online (Sandbox Code Playgroud)

  • @thehouse - 你的意思是什么编码标准?我不认为使用任意类作为基础有任何错误,只要它不在多态上下文中使用.例如,如果我做了像`string*ptr = new Line这样的东西,那么我的答案中的继承方案会很危险.删除ptr;`但这不是这里的情况 (4认同)
  • 这是错误的,完全错误的,并且在原始示例中并非如此(作者明智地选择了`Composition`)。`@Manuel` 证明我没有人会在多态上下文中使用它们......我在等待。 (2认同)
  • 你能解释为什么我们需要继承字符串类吗? (2认同)
  • 最后我使用了这种方法,但将 `std::string` 存储为成员而不是继承 - 这是一个品味问题。 (2认同)
  • 值得指出的是,继承是调整接口的好方法.它易于阅读和理解.如果没有引入新成员,那么基于堆的逻辑不会毁了你.更复杂的是要求麻烦 (2认同)

Mat*_*lia 22

标准库不提供迭代器来执行此操作(虽然您可以自己实现类似的东西),但您可以简单地使用getline 函数(而不是istream方法)从输入流读取整行到C++字符串.

例:

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个差异已在流对象中处理:当您以文本模式打开文件时(默认情况下,如果您未指定`ios :: binary`标志),流会自动将特定于平台的eol转换为plain \n `. (2认同)

Rex*_*xar 5

这是一个解决方案.该例程在每行末尾用@@打印输入文件.

#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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:曼努埃尔的速度更快.