ifstream::read
バイトをバッファに読み込むだけで、バッファの最後にn
追加しませんよね? '\0'
次に、バッファを使用すると、バッファの終わりをどのように知ることができますか?
'\0'
バッファの最後に手動で a を追加する必要がありますか?
はifstream
、ファイル、バイナリ、またはテキストから読み取るために使用されます。でバイナリ ファイルを処理する場合read
、(ファイル自体から、または によって追加されたread
) ゼロ バイトの元を確認できないため、 read は宛先バッファにゼロを追加しません。
テキスト ファイルで作業している場合は、std::getlineを使用して、次を受け取ることができますstd::string
。
istream& getline ( istream& is, string& str );
はい、その通りです。手動でバッファの末尾に追加する必要があります: buffer[length] = '\0';
null ターミネータが必要な場合。呼び出すときwrite
に、出力の長さを指定することもできます。これにより、null ターミネータを使用しないようにする必要があるのをいつ停止するかを伝えるために、データの数std::cout.write(buffer, length);
のみが出力されます。ただし、より堅牢なアプローチを検討length
します。std::getline
std::string
std::string
with を読み込んでいる場合std::getline
、文字列は長さを持ちます -はC スタイルの文字列のように でstd::string
終了しません。std::string を読み取ってから string.c_str() を使用すると、null で終了します。これは、C スタイルの文字列に使用できます。'\0'
char*
読み込んでいる場合はchar*
、長さを指定する必要があります。これ'\0'
は、検出されたものとは無関係に読み取られるバイト数です。この場合、バッファの末尾に手動で '\0' を追加する必要があります。
スペースがある限り、バッファの最後に好きなものを入れることができます。
istream::read
読み取ったバイト数はわかりません。要求したものをすべて読み取るか、ストリームの状態を fail/eof に変更します。
予想よりバイト数が少ない可能性がある場合に対処したい場合は、 を使用istream::readsome
します。抽出されたバイト数が返されます。
他の回答が述べたように、文字列を扱っている場合はstd::getline
、 や>>
エクストラクタなどの文字列を読み取る関数を使用してください。istream::read
はバイナリ データ用です。この場合std::streambuf
、通常は を使用する方が便利です。
ifstream::gcount()
操作で読み取った文字数を決定するために呼び出すことができますread()
。