ファイル全体をメモリに読み込み、それを C++ に配置する必要がありますstd::string
。
これを に読み解くとchar[]
、答えは非常に簡単になります。
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 ...
ここで、まったく同じことをしたいのですが、std::string
の代わりにを使用しますchar[]
。ループを避けたいので、次のことはしたくありません。
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()
何か案は?
ベストアンサー1
いくつかの可能性があります。私が気に入っているのは、仲介役として文字列ストリームを使用する方法です。
std::ifstream t("file.txt");
std::stringstream buffer;
buffer << t.rdbuf();
これで、「file.txt」の内容が文字列として利用できるようになりますbuffer.str()
。
もう一つの可能性は(もちろん私も好きではありませんが)、あなたのオリジナルにかなり似ています。
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);
公式には、これは C++98 または 03 標準で動作する必要はありません (文字列はデータを連続して格納する必要はありません) が、実際にはすべての既知の実装で動作し、C++11 以降では連続したストレージが必要なので、動作することが保証されています。
後者も好きではない理由は、まず、長くて読みにくいからです。次に、文字列の内容を必要のないデータで初期化し、すぐにそのデータを上書きする必要があるからです (はい、初期化にかかる時間は読み取り時間に比べて通常は取るに足らないので、おそらく問題にはなりませんが、それでも私にとってはちょっと間違っているように感じます)。3 番目に、テキスト ファイルでは、ファイル内の位置 X は、必ずしもその位置に到達するために X 文字を読み取らなければならないことを意味しません。つまり、行末の変換などを考慮する必要はありません。このような変換を行う実際のシステム (Windows など) では、変換された形式はファイル内の形式よりも短くなります (つまり、ファイル内の "\r\n" は、変換された文字列では "\n" になります)。そのため、実際には使用しない余分なスペースが少し確保されるだけです。繰り返しますが、これは実際には大きな問題にはなりませんが、とにかく少し間違っているように感じます。