4

For write(fd[1], string, size)- 如果string短于会发生什么size

我查看了手册页,但没有明确说明这种情况。我知道对于read,它只会停在那里并阅读任何string内容,但对于write. 那么写是做什么的呢?返回值仍然size是它是否附加了空终止符?为什么它不只是停止read

4

4 回答 4

5

当您调用write()时,系统假定您正在将通用数据写入某个文件 - 它并不关心您是否有一个字符串。以 null 结尾的字符串被视为一堆非零字节,后跟一个零字节 - 系统将继续写入,直到写入size字节。

因此,指定size哪个比你的字符串长可能是危险的。系统很可能正在从您的文件中读取超出字符串末尾的数据,可能充满了垃圾数据。

于 2014-03-06T04:51:04.707 回答
3

write将写入size从 开始的数据字节string。如果将 string 定义为比 size 短的数组,它将具有未定义的行为。但在您之前的问题中,char *line = "apple";包含 6 个字符(即 a、p、p、l、e 和空字符)。

所以最好把size设置的值写成正确的值

于 2014-03-06T04:50:57.707 回答
0

write(int fildes, const void *buf, size_t nbyte)不写入以空值结尾的字符串。它写入缓冲区的内容。如果缓冲区中有任何空字符,它们也会被写入。

read(int fildes, void *buf, size_t nbyte)也不注意空字符。它将多个字节读入给定的缓冲区,最大为 nbyte。它不添加任何空终止字节。

这些是低级例程,设计用于读取和写入任意数据。

于 2014-03-06T04:54:50.980 回答
0

write调用输出给定大小的缓冲区。它不会尝试解释缓冲区中的数据。也就是说,你给它一个指向内存位置的指针和要写入的字节数(长度)然后,只要这些内存位置存在于程序数据的合法部分中,它就会将这些字节复制到输出文件描述符。

与字符串操作例程写入和读取不同,忽略空字节,即值为零的字节。 read确实注意 EOF 字符,并且在某些设备上,只会读取当时可用的数据量,可能返回的数据少于请求的数据,但它们对原始字节进行操作而不将它们解释为“字符串”。

如果您尝试写入的数据多于缓冲区包含的数据,它可能会或可能不会工作,具体取决于内存的位置。充其量是未定义的行为。在最坏的情况下,你会得到一个段错误,你的程序会崩溃。

于 2014-03-06T05:01:05.250 回答