我很好奇为什么当从文件读取少于4个字节时,输出已损坏.
这是我的测试文件:
user@UnixVM:~/labs$ cat foo.txt
helloworld
Run Code Online (Sandbox Code Playgroud)
还有一个从文件中读取的简单程序:
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;
}
Run Code Online (Sandbox Code Playgroud)
输出已损坏,执行之间可能不同:
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?
Run Code Online (Sandbox Code Playgroud)
但每次我将字节数读取大于或等于4(read(file,buffer,4);),它都可以正常工作.
您的输出"已损坏",因为buffer它不包含已NUL终止的C字符串.了解更多关于未定义行为.被吓(UB有时会出现上班,这或许可以解释你尝试什么).
所以在你打电话之前read添加memset(buffer, 0, sizeof(buffer))清除你的buffer.或者初始化它char buffer[11] ="";(两者几乎等效且可能,例如gcc -O2,启用优化以生成相同的机器代码).由于您的缓冲区长度为11个字节,并且您read最多只有3个字节,因此您将确保它NUL在之后终止read.
一定要编译所有警告和调试信息(所以gcc -Wall -Wextra -g lab1_4.c -o lab1_4在你的情况下).阅读如何调试小程序
仔细阅读read(2)和您正在使用的每个功能的文档.注意来自的返回计数read.你应该测试并使用它.