There are a couple of possibilities. One I like uses a stringstream as a go-between:
std::ifstream t("file.txt"); std::stringstream buffer; buffer << t.rdbuf();
Now the contents of “file.txt” are available in a string as buffer.str()
.
Another possibility (though I certainly don’t like it as well) is much more like your original:
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);
Officially, this isn’t required to work under the C++98 or 03 standard (string isn’t required to store data contiguously) but in fact it works with all known implementations, and C++11 and later do require contiguous storage, so it’s guaranteed to work with them.
As to why I don’t like the latter as well: first, because it’s longer and harder to read. Second, because it requires that you initialize the contents of the string with data you don’t care about, then immediately write over that data (yes, the time to initialize is usually trivial compared to the reading, so it probably doesn’t matter, but to me it still feels kind of wrong). Third, in a text file, position X in the file doesn’t necessarily mean you’ll have read X characters to reach that point — it’s not required to take into account things like line-end translations. On real systems that do such translations (e.g., Windows) the translated form is shorter than what’s in the file (i.e., “\r\n” in the file becomes “\n” in the translated string) so all you’ve done is reserved a little extra space you