我很好奇为什么从文件中读取少于4个字节时输出损坏。
这是我的测试文件:
closure
还有一个用于读取文件的简单程序:
user@UnixVM:~/labs$ cat foo.txt
helloworld
输出已损坏,执行之间可能有所不同:
int main()
{
int file=0;
if((file=open("foo.txt",O_RDONLY)) < -1)
return 1;
char buffer[11];
read(file,buffer,3);
printf("%s\n",buffer);
return 0;
}
但是每当我使字节数大于或等于4(user@UnixVM:~/labs$ gcc -Wall lab1_4.c -o lab1_4 ; ./lab1_4
hel2
user@UnixVM:~/labs$ gcc -Wall lab1_4.c -o lab1_4 ; ./lab1_4
hel▒
)时,它就可以正常工作。
答案 0 :(得分:6)
您的输出已“损坏”,因为buffer
不包含以 NUL 结尾的C字符串。进一步了解undefined behavior。是scared(UB有时会出现 起作用,这也许可以解释您的实验内容)。
因此,在致电read
之前,请添加memset(buffer, 0, sizeof(buffer))
以清除您的buffer
。或使用char buffer[11] ="";
对其进行初始化(两者几乎相同,并且可能启用了gcc -O2
这样的优化以生成相同的机器代码)。由于缓冲区的长度为11个字节,并且read
最多为3个字节,因此您可以确定它在<read
之后终止了 NUL 。
确保编译所有警告和调试信息(以您的情况为gcc -Wall -Wextra -g lab1_4.c -o lab1_4
)。阅读How to debug small programs
请仔细阅读read(2)和所使用的每个功能的文档。注意read
的返回计数。您应该测试并使用它。
答案 1 :(得分:-2)
让我们从上至下阅读它:
if((file=open("foo.txt",O_RDONLY)) < -1)
如果您read the Open man page,您会看到它在失败时返回-1,因此由于“ <”,您的陈述是错误的。
然后
char buffer[11];
read(file,buffer,3);
您声明一个大小为11的缓冲区,但读取了3个字节。可以,这不是最好的方法,但它不会爆炸。
但是
printf("%s\n",buffer);
此行有问题。您应该read this tutorial about strings in C来理解。
每当遇到内存问题时,请使用Valgrind,这是一个很好的工具,可以帮助您查看错误所在。