5

ifstream::readバイトをバッファに読み込むだけで、バッファの最後にn追加しませんよね? '\0'次に、バッファを使用すると、バッファの終わりをどのように知ることができますか?

'\0'バッファの最後に手動で a を追加する必要がありますか?

4

5 に答える 5

4

ifstream、ファイル、バイナリ、またはテキストから読み取るために使用されます。でバイナリ ファイルを処理する場合read、(ファイル自体から、または によって追加されたread) ゼロ バイトの元を確認できないため、 read は宛先バッファにゼロを追加しません。

テキスト ファイルで作業している場合は、std::getlineを使用して、次を受け取ることができますstd::string

istream& getline ( istream& is, string& str );
于 2012-07-26T03:46:54.630 に答える
1

はい、その通りです。手動でバッファの末尾に追加する必要があります: buffer[length] = '\0';null ターミネータが必要な場合。呼び出すときwriteに、出力の長さを指定することもできます。これにより、null ターミネータを使用しないようにする必要があるのをいつ停止するかを伝えるために、データの数std::cout.write(buffer, length);のみが出力されます。ただし、より堅牢なアプローチを検討lengthします。std::getlinestd::string

于 2012-07-26T03:03:11.433 に答える
1

std::stringwith を読み込んでいる場合std::getline、文字列は長さを持ちます -はC スタイルの文字列のように でstd::string終了しません。std::string を読み取ってから string.c_str() を使用すると、null で終了します。これは、C スタイルの文字列に使用できます。'\0'char*

読み込んでいる場合はchar*、長さを指定する必要があります。これ'\0'は、検出されたものとは無関係に読み取られるバイト数です。この場合、バッファの末尾に手動で '\0' を追加する必要があります。

于 2012-07-26T03:03:31.270 に答える
0

スペースがある限り、バッファの最後に好きなものを入れることができます。 istream::read読み取ったバイト数はわかりません。要求したものをすべて読み取るか、ストリームの状態を fail/eof に変更します。

予想よりバイト数が少ない可能性がある場合に対処したい場合は、 を使用istream::readsomeします。抽出されたバイト数が返されます。

他の回答が述べたように、文字列を扱っている場合はstd::getline、 や>>エクストラクタなどの文字列を読み取る関数を使用してください。istream::readはバイナリ データ用です。この場合std::streambuf、通常は を使用する方が便利です。

于 2012-07-26T15:01:07.257 に答える
0

ifstream::gcount()操作で読み取った文字数を決定するために呼び出すことができますread()

于 2012-07-26T22:18:31.853 に答える