I need to read a whole file into memory and place it in a C++ std::string
.
If I were to read it into a char[]
, the answer would be very simple:
std::ifstream t;
int length;
t.open("file.txt"); // open input file
t.seekg(0, std::ios::end); // go to the end
length = t.tellg(); // report location (this is the length)
t.seekg(0, std::ios::beg); // go back to the beginning
buffer = new char[length]; // allocate memory for a buffer of appropriate dimension
t.read(buffer, length); // read the whole file into the buffer
t.close(); // close file handle
// ... Do stuff with buffer here ...
Now, I want to do the exact same thing, but using a std::string
instead of a char[]
. I want to avoid loops, i.e. I don't want to:
std::ifstream t;
t.open("file.txt");
std::string buffer;
std::string line;
while(t){
std::getline(t, line);
// ... Append line to buffer and go on
}
t.close()
Any ideas?
std::getline(istream&, std::string&)
would still do the right thing. – Burckstreampos
returned bytellg()
into anint
is not guaranteed to return the length of the file. If you subtract thestreampos
at the start of the file from that at the end of the file, you will get astreamoff
which is guaranteed to be of an integral type and represent an offset in the file, at least in C++11. See cplusplus.com/reference/ios/streamoff and the comment in https://mcmap.net/q/57275/-what-are-the-differences-between-streampos-and-pos_type-streamoff-and-off_type. See https://mcmap.net/q/57276/-using-c-filestreams-fstream-how-can-you-determine-the-size-of-a-file for a safe version. – Begotten