C读取的最小字节数

usi*_*ace 2 c

我很好奇为什么当从文件读取少于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);),它都可以正常工作.

Bas*_*tch 6

您的输出"已损坏",因为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.你应该测试并使用它.