在C ++中将文件内容读入一个string

可能重复:
什么是最好的方法sl文件到一个std ::string在c + +?

在像Perl这样的脚本语言中,可以一次性将文件读入一个variables。

open(FILEHANDLE,$file); $content=<FILEHANDLE>; 

C ++中最有效的方法是什么?

喜欢这个:

 #include <fstream> #include <string> int main(int argc, char** argv) { std::ifstream ifs("myfile.txt"); std::string content( (std::istreambuf_iterator<char>(ifs) ), (std::istreambuf_iterator<char>() ) ); return 0; } 

该声明

  std::string content( (std::istreambuf_iterator<char>(ifs) ), (std::istreambuf_iterator<char>() ) ); 

可以分成

 std::string content; content.assign( (std::istreambuf_iterator<char>(ifs) ), (std::istreambuf_iterator<char>() ) ); 

如果您只想覆盖现有的std :: stringvariables的值,这是非常有用的。

最有效的,但不是C ++的方式是:

  FILE* f = fopen(filename, "r"); // Determine file size fseek(f, 0, SEEK_END); size_t size = ftell(f); char* where = new char[size]; rewind(f); fread(where, sizeof(char), size, f); delete[] where; 

#编辑 – 2

刚刚testing过std::filebuf变种。 看起来它可以被称为最好的C ++方法,即使它不是一个C ++的方法,但更多的包装。 无论如何,这里是大致和C一样快的代码块。

  std::ifstream file(filename, std::ios::binary); std::streambuf* raw_buffer = file.rdbuf(); char* block = new char[size]; raw_buffer->sgetn(block, size); delete[] block; 

我在这里做了一个快速的基准,结果如下。 testing是在读取具有适当( std::ios:binaryrb )模式的65536K二进制文件时完成的。

 [==========] Running 3 tests from 1 test case. [----------] Global test environment set-up. [----------] 4 tests from IO [ RUN ] IO.C_Kotti [ OK ] IO.C_Kotti (78 ms) [ RUN ] IO.CPP_Nikko [ OK ] IO.CPP_Nikko (106 ms) [ RUN ] IO.CPP_Beckmann [ OK ] IO.CPP_Beckmann (1891 ms) [ RUN ] IO.CPP_Neil [ OK ] IO.CPP_Neil (234 ms) [----------] 4 tests from IO (2309 ms total) [----------] Global test environment tear-down [==========] 4 tests from 1 test case ran. (2309 ms total) [ PASSED ] 4 tests. 

最有效的方法是创build正确大小的缓冲区,然后将文件读入缓冲区。

 #include <fstream> #include <vector> int main() { std::ifstream file("Plop"); if (file) { /* * Get the size of the file */ file.seekg(0,std::ios::end); std::streampos length = file.tellg(); file.seekg(0,std::ios::beg); /* * Use a vector as the buffer. * It is exception safe and will be tidied up correctly. * This constructor creates a buffer of the correct length. * Because char is a POD data type it is not initialized. * * Then read the whole file into the buffer. */ std::vector<char> buffer(length); file.read(&buffer[0],length); } } 

文本文件中不应该有\0

 #include<iostream> #include<fstream> using namespace std; int main(){ fstream f(FILENAME, fstream::in ); string s; getline( f, s, '\0'); cout << s << endl; f.close(); } 

这取决于很多东西,比如文件大小,文件types(文本/二进制文件)等等。前一段时间,我使用streambuf迭代器对以下函数进行了基准testing – 这个速度大约是其两倍:

 unsigned int FileRead( std::istream & is, std::vector <char> & buff ) { is.read( &buff[0], buff.size() ); return is.gcount(); } void FileRead( std::ifstream & ifs, string & s ) { const unsigned int BUFSIZE = 64 * 1024; // reasoable sized buffer std::vector <char> buffer( BUFSIZE ); while( unsigned int n = FileRead( ifs, buffer ) ) { s.append( &buffer[0], n ); } } 

也许不是最高效的,但读取一行数据:

 #include<iostream> #include<vector> #include<iterator> main(int argc,char *argv[]){ // read standard input into vector: std::vector<char>v(std::istream_iterator<char>(std::cin), std::istream_iterator<char>()); std::cout << "read " << v.size() << "chars\n"; } 

这是一个基于迭代器的方法。

 ifstream file("file", ios::binary); string fileStr; istreambuf_iterator<char> inputIt(file), emptyInputIt back_insert_iterator<string> stringInsert(fileStr); copy(inputIt, emptyInputIt, stringInsert);