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';如果你想要一个空终止符。当您调用时,write您还可以指定输出的长度:std::cout.write(buffer, length);它将仅输出length数据数以告诉它何时停止要求您不要使用空终止符。不过,我会研究std::getlinestd::string寻求更强大的方法。

于 2012-07-26T03:03:11.433 回答
1

如果您正在阅读std::string说, with std::getline,那么 string 带有一个长度 -不会像 C 风格的字符串std::string那样终止。如果您读入 std::string 然后使用 string.c_str() 则以空值终止。您可以将其用于 C 风格的字符串。'\0'char*

如果您正在阅读char*,则必须提供一个长度 - 即读取的字节数与'\0'找到的字节数无关。在这种情况下,您应该在缓冲区末尾手动附加一个 '\0'。

于 2012-07-26T03:03:31.270 回答
0

您可以调用ifstream::gcount()以确定在read()操作中读取的字符数。

于 2012-07-26T22:18:31.853 回答
0

你可以把任何你想要的东西放在缓冲区的末尾,只要它有空间。 istream::read没有告诉你它读取了多少字节;它要么读取您要求的所有内容,要么将流的状态更改为失败/eof。

如果要处理字节数可能少于预期的情况,请使用istream::readsome,它会返回提取的字节数。

正如提到的其他答案,如果您正在处理字符串,请使用读取字符串的函数,例如std::getline>>提取器。istream::read用于二进制数据——在这种情况下std::streambuf通常使用起来更方便。

于 2012-07-26T15:01:07.257 回答