【问题标题】:A one-liner to read text file into std::string in c++? [closed]在 C++ 中将文本文件读入 std::string 的单线器? [关闭]
【发布时间】:2013-03-27 14:51:01
【问题描述】:

是否有一种方法可以将(不是很大)文本文件的内容读入字符串?

我找到的最短的:

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
                 std::istreambuf_iterator<char>());

(对于大文件,请注意这是一种效率极低的解决方案,因为它必须在从流中读取每个新字符后重新分配缓冲区。)

信用:@Tyler McHenry Read whole ASCII file into C++ std::string

【问题讨论】:

  • 您要的是单线,然后是最短的。你要哪一个?
  • 这个有什么实际用途?他们是否会为您输入的每一行代码从您的工资中扣除费用?
  • 我不确定你所说的tourists是什么意思。
  • 游客:人们在遥远的未来寻找相同的答案。

标签: c++ string file-io ifstream lines-of-code


【解决方案1】:

您可以在一条语句中完成:

std::string str(std::istreambuf_iterator<char>(std::ifstream("file.txt").rdbuf()), std::istreambuf_iterator<char>());

是否单线取决于你的显示器有多大...

【讨论】:

    【解决方案2】:

    请注意不适合大文件

    与其说“不适合大文件”,不如说这是效率极低的解决方案,因为它必须反复重新分配从流中读取新字符时的缓冲区。

    另请注意,在这种情况下,您的代码行数是您最不应该关注的指标之一。一旦您拥有ifstream 对象(其名称应该比t 更有意义),
    您应该检查它的状态,无论是is_open() 还是更合理的读取方式似乎是这种方法:

    // obtain the size of the input file stream:
    file.seekg(0, std::ios::end);
    std::streampos fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    
    // read the file into the string:
    std::string fileData(fileSize);
    file.read(&fileData[0], fileSize);
    

    “更少的代码行数”并不总是意味着“更好”

    【讨论】:

    • 字符串不会呈指数增长?
    • @LightnessRacesinOrbit:我实际上不确定,我已经编辑了那行。我只是在以这种方式读取文件内容方面有非常不愉快的经历(尽管我以前一直使用std::vector,而不是std::string
    • @LightnessRacesinOrbit:在指数扩展的情况下,我会担心该解决方案的内存需求,而不是因为有时它可能导致分配的内存几乎是所需内存的两倍。
    • vector 的两个迭代器构造函数最多只能执行 O(log N) 重新分配(如果迭代器是 ForwardIterator 或更好,则没有,当然这个不是),所以它必须成倍增长。不过,我看不到 basic_string 的要求。
    猜你喜欢
    • 2014-12-15
    • 2010-09-12
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多