在C ++中将文本文件粘贴到std :: string的数组/集合中的最佳方法是什么?

时间:2013-01-28 11:47:09

标签: c++ stl

What is the best way to read an entire file into a std::string in C++?的样式我想问一个类似的问题,除了我希望我的输出是一个包含文本文件中的行的数组/ STL容器。

C#/ .net有一个相当有用的File.ReadAllLines()实用程序函数,一个好的C ++(STL)版本会是什么样的?

4 个答案:

答案 0 :(得分:6)

在C ++中,你可以这样做。

  • 将结构定义为:

    struct line : std::string 
    {
       friend std::istream & operator >> (std::istream & in, line & ln)
       {
          return std::getline(in, ln);
       }
    };
    
  • 然后这样做:

    std::ifstream file("file.txt");
    std::istream_iterator<line> begin(file), end;
    std::vector<std::string> allLines(begin, end);
    
  • 完成!

使用此方法,您可以直接使用迭代器对beginend。无需使用std::vector<std::string>。请注意,line可以隐式转换为std::string。因此,您可以将beginend与标准算法结合使用。

例如,

  • 找到最长的一行:

    auto cmp = [](line const &a, line const& b) { return a.size() < b.size(); };
    std::string longestLine = *std::max_element(begin, end, cmp);
    
  • 计算长度大于10的行:

    auto cmp = [](line const &a) { return a.size() > 10 ; };
    size_t count = std::count_if(begin, end, cmp);
    
  • 等等。通过这种方式,您可以直接使用beginend。无需使用std::vector。节省记忆。

希望有所帮助。

答案 1 :(得分:4)

标准习语:

#include <fstream>
#include <string>
#include <vector>
#include <utility>

std::ifstream infile("file.txt");
std::vector<std::string> v;

for (std::string line; std::getline(infile, line); )
{
    v.push_back(std::move(line));
}

答案 2 :(得分:3)

std::ifstream ifs(name);
std::vector<std::string> lines;
std::string line;
while (std::getline(ifs, line))
    lines.push_back(line);

答案 3 :(得分:1)

@ {Nawaz的想法是my attempt。我已经避免继承std::string,因为我对此感到有点不安:

#include <iostream>
#include <iterator>
#include <vector>

struct Line 
{
    operator const std::string&() const {return string;}
    std::string string;
};

std::istream& operator>>(std::istream& in, Line& line)
{
    return std::getline(in, line.string);
}

int main()
{
    std::istream_iterator<Line> begin(std::cin), end;
    std::vector<std::string> allLines(begin, end);

    std::cout << allLines.size() << " lines read from file:" << std::endl;
    std::copy(allLines.begin(), allLines.end(),
          std::ostream_iterator<std::string>(std::cout, "|"));
    return 0;
}