-3

重複の可能性:
c++ でファイルを std::string に丸呑みする最良の方法は何ですか?

C++ 用の PHP の file_get_contents() 関数を模倣しようとしています。

ただし、char 配列を文字列に変換すると、nullbyte で停止します。

fread(charbuf, 1, file_size, fp);
string str(charbuf);

文字列を静的サイズの配列として初期化し、ファイルの内容をそのコンテナーに直接読み取るにはどうすればよいですか? また、その文字列を初期化するのに十分なメモリがない場合など、エラーを確認するにはどうすればよいですか。これにより、現在使用している一時的なメモリ割り当ても削除されますが、これを削除したいと考えています。

安全性はどうですか?多くのプロセスが同じファイルを同時に読み取ったり、読み取り中にそれらの1つが同時に書き込みを行ったりする可能性はありますか? そのようなことが起こらないようにするにはどうすればよいですか?

「文字列はバイナリコンテナではありません」以外の方法で答えていただければ幸いです。

事実について、この質問を再開するようにお願いします。 – Konrad Rudolph 10 年 10 月 25 日 6:25" at What is the best way to read a whole file into a std::string in C++? それとも、文字列の余分なコピーを持たずにファイルを読み取るように求める新しい質問を作成しますか?

4

2 に答える 2

6
std::ifstream fin("somefile.txt");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();

このスニペットは、すべてのファイルを std::string に配置します

于 2012-09-21T13:57:32.667 に答える
0

「文字列はバイナリ コンテナーではありません。

std::string バイナリ コンテナーですが、選択したコンストラクターは C スタイルの文字列を引数として取ります。別のコンストラクターを試してください。

std::fread(charbuf, 1, file_size, fp);
std::string str(charbuf, file_size);

編集:メモリ割り当てを回避するための要件を考慮に入れる:

std::string str(file_size, 0);
std::fread(&str[0], 1, file_size, fp);
于 2012-09-21T13:58:09.920 に答える