C++ ifstream::read不追加'\0';

C++ ifstream::read不追加'\0';,c++,ifstream,C++,Ifstream,ifstream::read只将n字节读入缓冲区,但不将'\0'追加到缓冲区的末尾,对吗?那么当我使用缓冲区时,它如何知道缓冲区的结束 我是否应该手动将'\0'附加到缓冲区的末尾?是的,您是正确的,您需要手动将其附加到缓冲区的末尾:buffer[length]='\0'如果需要空终止符。 调用write时,还可以指定输出的长度:std::cout.write(缓冲区,长度)只输出长度数据数,告诉它何时停止要求您不要使用空终止符。 不过,我会研究一下std::getline和std::string

ifstream::read
只将
n
字节读入缓冲区,但不将
'\0'
追加到缓冲区的末尾,对吗?那么当我使用缓冲区时,它如何知道缓冲区的结束


我是否应该手动将
'\0'
附加到缓冲区的末尾?

是的,您是正确的,您需要手动将其附加到缓冲区的末尾:
buffer[length]='\0'如果需要空终止符。
调用
write
时,还可以指定输出的长度:
std::cout.write(缓冲区,长度)
只输出
长度
数据数,告诉它何时停止要求您不要使用空终止符。
不过,我会研究一下
std::getline
std::string
,寻找一种更可靠的方法。

如果你阅读
std::string
比如说,使用
std::getline
,那么字符串携带一个长度-
std::string
不会像C-style
char*
字符串那样以
'\0'
结尾。如果读入std::string,然后使用string.c_str(),则以null结尾。您可以将其用于C样式字符串


如果要读取
char*
,则必须提供一个长度,即独立于找到的任何
'\0'
读取的字节数。在这种情况下,您应该在缓冲区的末尾手动附加一个“\0”。
ifstream
用于读取文件、二进制文件或文本。在处理具有
读取
的二进制文件时,无法确定零字节的来源(来自文件本身或由
读取
附加),因此读取不会将零附加到目标缓冲区

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

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

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

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


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

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

std::string
保证在C++11中以null结尾,IIRC.他为什么要这么做?
read
方法适用于原始数据,对“\0”没有特殊的解释。@DanielKO:我刚刚意识到你说的是在将缓冲区传递给
read
之前附加空终止符。这个问题专门讨论了在调用
read
后使用缓冲区。不,我是说在读取二进制数据时不需要任何终止符。如果你说的是字符串,那么
istream::read
不是你应该使用的函数。@DanielKO:OP是在读取文本数据。这就是为什么我说使用
std::string
std::getline
来获得更好的方法。OP提到将字节读取到缓冲区,似乎对“\0”的用法感到困惑。答案中只提到字符串,从问题中的“\0”推断数据是字符串。我发现人们通常会误解“\0”的用法,就好像它是某种魔术标记一样,就像人们误解“EOF”是一个标志文件结束的魔术字节一样。唉,我的答案是唯一一个指出处理二进制数据不使用空终止符的区别的答案,结果被否决了。