ifstream::read
只是将n
字节读入缓冲区,但不会附加'\0'
到缓冲区的末尾,对吗?那么当我使用缓冲区时,它是如何知道缓冲区结束的呢?
我应该'\0'
在缓冲区末尾手动附加 a 吗?
ifstream
用于从文件、二进制文件或文本中读取。在处理带有 的二进制文件时read
,无法确定零字节的来源(来自文件本身或由 附加read
),因此 read 不会将零附加到目标缓冲区。
如果您正在处理文本文件,则可以使用std::getline并接收std::string
:
istream& getline ( istream& is, string& str );
是的,你是对的,你需要手动将它附加到缓冲区的末尾:buffer[length] = '\0';
如果你想要一个空终止符。当您调用时,write
您还可以指定输出的长度:std::cout.write(buffer, length);
它将仅输出length
数据数以告诉它何时停止要求您不要使用空终止符。不过,我会研究std::getline
并std::string
寻求更强大的方法。
如果您正在阅读std::string
说, with std::getline
,那么 string 带有一个长度 -不会像 C 风格的字符串std::string
那样终止。如果您读入 std::string 然后使用 string.c_str() 则以空值终止。您可以将其用于 C 风格的字符串。'\0'
char*
如果您正在阅读char*
,则必须提供一个长度 - 即读取的字节数与'\0'
找到的字节数无关。在这种情况下,您应该在缓冲区末尾手动附加一个 '\0'。
您可以调用ifstream::gcount()
以确定在read()
操作中读取的字符数。
你可以把任何你想要的东西放在缓冲区的末尾,只要它有空间。
istream::read
没有告诉你它读取了多少字节;它要么读取您要求的所有内容,要么将流的状态更改为失败/eof。
如果要处理字节数可能少于预期的情况,请使用istream::readsome
,它会返回提取的字节数。
正如提到的其他答案,如果您正在处理字符串,请使用读取字符串的函数,例如std::getline
或>>
提取器。istream::read
用于二进制数据——在这种情况下std::streambuf
通常使用起来更方便。