将整个文本文件读入内存,然后逐行处理,无需分配/复制

时间:2018-04-06 21:59:10

标签: c++ c++17 ifstream stringstream string-view

假设我们已经通过

将文本文件的内容读入stringstream
std::ifstream file(filepath);
std::stringstream ss;
ss << file.rdbuf();

现在想要逐行处理文件。这可以通过

完成
for (std::string line; std::getline(ss, line);)
{
}

但是,请记住ss包含内部缓冲区中文件的全部内容(并且我们可以通过string将此内容作为ss.str()获取),代码以上是非常低效的。对于文件的每一行,执行内存分配和复制操作。

是否有可能提出以line形式提供std::string_view的解决方案? (可以随意使用其他机制加载整个文件;我不需要通过stringstream访问它。)

1 个答案:

答案 0 :(得分:-1)

  

上面的代码非常低效。对于文件的每一行,执行内存分配和复制操作。

     

是否有可能提出一个以std :: string_view形式提供行的解决方案?

不,据我所知。

但您可以使用getline()中的stringstream方法接收指向char的指针。

某事(警告:代码未经测试)

constexpr std::size_t dim { 100U }; // choose you the dim

char buff[dim];

while ( ss.getline(buff, dim) )
 {
   // do something
 }

副本仍然存在,但至少,这样你应该避免 - 对于每一行 - 分配。