将整个ASCII文件读入C ++ std :: string

这个问题在这里已经有了答案:

  • 在C ++中将整个文件读入std :: string的最佳方式是什么? 11个答案

  • 更新:原来,这个方法在遵循STL习语的同时,实际上效率却非常低下! 不要用大文件来做这件事。 (请参阅:http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html)

    你可以在文件之外创建一个streambuf迭代器并用它初始化字符串:

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

    不知道你从哪里得到t.open("file.txt", "r")语法。 据我所知,这不是一个std::ifstream的方法。 看起来你已经与C的fopen混淆了。

    编辑:另外注意围绕字符串构造函数的第一个参数的额外括号。 这些至关重要。 他们防止称为“最令人头痛的解析”的问题,在这种情况下,它实际上不会像往常一样给你编译错误,但会给你带来有趣的结果(读取错误)。

    按照KeithB的观点,这里有一种方法可以预先分配所有内存(而不是依赖字符串类的自动重新分配):

    #include <string>
    #include <fstream>
    #include <streambuf>
    
    std::ifstream t("file.txt");
    std::string str;
    
    t.seekg(0, std::ios::end);   
    str.reserve(t.tellg());
    t.seekg(0, std::ios::beg);
    
    str.assign((std::istreambuf_iterator<char>(t)),
                std::istreambuf_iterator<char>());
    

    有几种可能性。 我喜欢使用串流作为中介:

    std::ifstream t("file.txt");
    std::stringstream buffer;
    buffer << t.rdbuf();
    

    现在“file.txt”的内容作为buffer.str()在字符串中可用。

    另一种可能性(虽然我当然不喜欢它)更像是你的原创:

    std::ifstream t("file.txt");
    t.seekg(0, std::ios::end);
    size_t size = t.tellg();
    std::string buffer(size, ' ');
    t.seekg(0);
    t.read(&buffer[0], size); 
    

    正式的,这不需要在C ++ 98或03标准下工作(字符串不需要连续存储数据),但实际上它可以与所有已知的实现一起工作,并且C ++ 11和更高版本确实需要连续存储,所以它保证与他们合作。

    至于我为什么不喜欢后者:首先,因为它更长,更难阅读。 其次,因为它要求你用你不关心的数据初始化字符串的内容,然后立即写这些数据(是的,与读数相比,初始化的时间通常是微不足道的,所以它可能并不重要,但对我来说,它仍然感觉有点不对)。 第三,在文本文件中,文件中的位置X并不一定意味着您将读取X个字符以达到该点 - 并不需要考虑线端翻译等事情。 在做这种翻译的真正系统上(例如Windows),翻译后的表格比文件中的内容更短(即文件中的“ r n”在翻译后的字符串中变为“ n”),所以你所做的保留一点你从不使用的额外空间。 再次,并不真的导致重大问题,但无论如何感觉有点不对。


    我认为最好的方法是使用字符串流。 简单而快捷!

    ifstream inFile;
    inFile.open(inFileName);//open the input file
    
    stringstream strStream;
    strStream << inFile.rdbuf();//read the file
    string str = strStream.str();//str holds the content of the file
    
    cout << str << endl;//you can do anything with the string!!!
    
    链接地址: http://www.djcxy.com/p/30755.html

    上一篇: Read whole ASCII file into C++ std::string

    下一篇: C++: "std::endl" vs "\n"