gpt4 book ai didi

C 读取的最小字节数

转载 作者:行者123 更新时间:2023-12-02 00:28:21 25 4
gpt4 key购买 nike

我很好奇为什么当从文件中读取少于 4 个字节时,输出会损坏。

这是我的测试文件:

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;
}

输出已损坏,执行之间可能不同:

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▒

但每次我使要读取的字节数大于或等于 4 (read(file,buffer,4);) 时,它都工作正常。

最佳答案

您的输出“已损坏”,因为 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 的返回计数。您应该测试并使用它。

关于C 读取的最小字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52869121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com