2013-03-27 21 views
0

是否有一行代码将一个(不是很大的)文本文件的内容读入字符串?在C++中将文本文件读入std :: string的一行代码?

我发现的最短的:(对于大文件指出,这是非常低效的解决方案,因为它每一个新的角色从流中读取后重新分配的缓冲区)

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

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

信用:@Tyler麦克亨利Read whole ASCII file into C++ std::string

+0

你问了一个一行,然后你'要求最短。你想要哪一个? – 0x499602D2 2013-03-27 14:52:33

+2

http://codegolf.stackexchange.com/ – NPE 2013-03-27 14:52:53

+0

@David单线划 – quimnuss 2013-03-27 15:03:34

回答

3

请注意,它不适合大文件

而不是“是不适合大文件”我宁愿说它是极其低效解决方案,因为它有反复重新分配缓冲区作为新角色正在从流中读取。

另请注意,在这种情况下,您的代码的行数是您最不应该关注的指标之一。一旦你有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); 

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

+0

字符串不会以指数方式扩展吗? – 2013-03-27 15:22:30

+0

@LightnessRacesinOrbit:我其实不确定,我已经编辑过这一行。我只是有这样阅读文件内容的不愉快的经历(虽然我以前一直使用'std :: vector',而不是'std :: string') – LihO 2013-03-27 15:29:19

+0

@LightnessRacesinOrbit:如果指数扩展,我会担心该解决方案的内存要求比有时它可能会导致几乎两倍的内存所需的分配。 – LihO 2013-03-27 15:31:58

7

你可以做一个单一的语句:

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

这是否是一个一行取决于有多大你的显示器是...

相关问题