将整个ASCII文件读入C ++ std :: string
这个问题在这里已经有了答案:
更新:原来,这个方法在遵循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