ifstream :: read不附加'\ 0'

时间:2012-07-26 02:54:55

标签: c++ ifstream

ifstream::read只是将n个字节读入缓冲区,但不会在缓冲区的末尾附加'\0',对吧?然后,当我使用缓冲区时,它如何知道缓冲区的结束?

我应该在缓冲区的末尾手动追加'\0'吗?

5 个答案:

答案 0 :(得分:3)

ifstream用于从文件,二进制文件或文本中读取。处理带有read的二进制文件时,无法确定零字节的来源(来自文件本身或附加read),因此读取不会将零附加到目标缓冲区。

如果您正在处理文本文件,则可以使用std::getline,并收到std::string

istream& getline ( istream& is, string& str );

答案 1 :(得分:1)

是的,你是对的,你需要手动将它附加到缓冲区的末尾:buffer[length] = '\0';如果你想要一个空终止符。 当您调用write时,您还可以指定输出的长度:std::cout.write(buffer, length);,它将仅输出length个数据,以告知它何时停止要求您不使用空终止符。 我会调查std::getlinestd::string以获得更强大的方法。

答案 2 :(得分:1)

如果您正在阅读std::stringstd::getline,那么字符串带有长度 - std::string不会被'\0'作为C样式{{1}终止字符串是。如果你读入std :: string然后使用string.c_str()那么它将以null结尾。您可以将其用于C风格的字符串。

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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