在c ++中读取文件并将其内容分配给字符串所需的最小代码是多少? 我确实阅读了很多有用的教程,但它们在某种程度上都有所不同,所以我想知道为什么,所以如果你能提供一些很好的解释性评论。
相关: What is the best way to read an entire file into a std::string in C++?
答案 0 :(得分:3)
答案 1 :(得分:2)
#include <fstream>
#include <string>
int main()
{
std::ifstream file("myfile.txt"); // open the file
std::string line, whole_file;
// Read one line at a time from 'file' and store the result
// in the string called 'line'.
while (std::getline(file, line))
{
// Append each line together so the entire file will
// be in one string.
whole_file += line;
whole_file += '\n';
}
return 0;
// 'file' is closed automatically when the object goes out of scope.
}
这里有几点需要注意。 getline()
返回对流对象的引用,如果发生任何错误或者到达文件末尾,则对while测试失败。此外,字符串中包含尾随换行符 not ,因此您必须手动附加它。
答案 2 :(得分:2)
最短的代码:(效率不高)
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <fstream>
int main()
{
std::ifstream f("plop");
std::string buffer;
std::copy(std::istreambuf_iterator<char>(f),
std::istreambuf_iterator<char>(),
std::back_inserter(buffer));
}
我怎么可能这样做:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <fstream>
int main()
{
// Find the size of the file
std::ifstream file("Plop");
file.seekg(0,std::ios_base::end);
std::streampos size = file.tellg();
// Read the file in one go.
file.seekg(0);
std::vector<char> buffer(size); // pre-szie the vector.
file.read(&buffer[0],size);
// or
// Until the next version of the standard I don't think string gurantees contigious storage.
// But all the current versions I know do use continious storage so it should workd.
file.seekg(0);
std::string buffer1(size);
file.read(&buffer1[0],size);
}
答案 3 :(得分:2)
我没有看到太多:
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main() {
ifstream ifs("filename");
stringstream ss;
ss << ifs.rdbuf();
string s = ss.str();
}
......正如我所料。你也想要一些错误检查。
Konrad Rudolph将此作为上述相关问题的答案。我想这不是重复的,因为这要求最短的代码,但答案是相同的。所以我把它作为wiki重新发布。
答案 4 :(得分:1)
我正在读每行的一句话。
#include<fstream>
#include<string>
using namespace std;
int main(int argc, char **argv)
{
fstream inFile;
string str;
while(!inFile.eof())
{
inFile.open("file.txt");
infile>>str;
}
inFile.close();
return 0;
}
答案 5 :(得分:0)
这比短解决方案更长,但可能稍微更高效,因为它的复制少一点 - 我没有做过任何时序比较:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;;
unsigned int FileRead( istream & is, vector <char> & buff ) {
is.read( &buff[0], buff.size() );
return is.gcount();
}
int main() {
ifstream ifs( "afile.dat", ios::binary );
const unsigned int BUFSIZE = 64 * 1024;
std::vector <char> buffer( BUFSIZE );
unsigned int n;
string s;
while( n = FileRead( ifs, buffer ) ) {
s.append( &buffer[0], n );
}
cout << s;
}
答案 6 :(得分:0)
如果您知道您的文件包含文字,那么您可以使用STLSoft的platformstl::memory_mapped_file
:
platformstl::memory_mapped_file file("your-file-name");
std::string contents(static_cast<char const*>(file.memory()), file.size());
或
platformstl::memory_mapped_file file("your-file-name");
std::wstring contents(static_cast<wchar_t const*>(file.memory()),
file.size() / sizeof(wchar_t));
在WIndows上,这将使您的字符串包含\r\n
个序列,因此您可以改为使用winstl::load_text_file()
函数:
std::string contents;
winstl::load_text_file("your-file-name", contents);
如果您希望将其加载到行集合中,请使用platformstl::read_lines()
:
platformstl::basic_file_lines<char> lines("your-file-name");
size_t n = lines.size();
std::string line3 = lines[3];