以在 C++ 中将整个文件读入 std::string 的最佳方式是什么?我想问一个类似的问题,除了我希望我的输出是一个包含文本文件中的行的数组/STL 容器。
C#/.net 有相当有用的File.ReadAllLines()实用函数,一个好的 C++ (STL) 版本会是什么样子?
以在 C++ 中将整个文件读入 std::string 的最佳方式是什么?我想问一个类似的问题,除了我希望我的输出是一个包含文本文件中的行的数组/STL 容器。
C#/.net 有相当有用的File.ReadAllLines()实用函数,一个好的 C++ (STL) 版本会是什么样子?
在 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);
完毕!
通过这种方法,您可以直接使用 iterator-pairbegin
和end
. 无需使用std::vector<std::string>
. 请注意,line
可以隐式转换为std::string
. begin
因此,您可以使用end
标准算法。
例如,
找到最长的线:
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);
很快。通过这种方式,您可以直接使用begin
and end
。无需使用std::vector
. 节省内存。
希望有帮助。
标准成语:
#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));
}
std::ifstream ifs(name);
std::vector<std::string> lines;
std::string line;
while (std::getline(ifs, line))
lines.push_back(line);
这是我对@Nawaz 想法的尝试。我避免从 继承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;
}