ifstream::read
只是将n
个字节读入缓冲区,但不会在缓冲区的末尾附加'\0'
,对吧?然后,当我使用缓冲区时,它如何知道缓冲区的结束?
我应该在缓冲区的末尾手动追加'\0'
吗?
答案 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::getline
和std::string
以获得更强大的方法。
答案 2 :(得分:1)
如果您正在阅读std::string
说std::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()
操作中读取的字符数。