总结到目前为止的反应,并添加我自己的观察:
open()
您应该检查和的返回值read()
。如果他们失败了,你将盲目地继续打印垃圾。
read()
返回读取的字符数,如果出错则返回 -1。它不会以空值终止其缓冲区,因此strlen()
用于查找读取的数据量是错误的。
您不应该strlen()
在循环测试条件中调用 to,因为您将在每次迭代时重新评估它。
buf[i]
声明中的toint
的强制转换printf
是不必要的。可变参数函数的额外参数printf
(即构成 的所有参数...
)经过默认参数提升,如下所示:
char
s、short
s 及其未签名的对应项被提升为int
s
float
s 提升为double
s
如果没有演员表,buf[i]
将被隐式提升为int
无论如何,因此添加演员表虽然正确,但会使代码对任何阅读它的人更加困惑。
因此,您的代码应如下所示:
int fd = open("test.txt",O_RDONLY);
if(fd < 0)
{
fprintf(stderr, "open failed: %s\n", strerror(errno));
return;
}
char buf[128];
// It's better to use sizeof(buf) here, so we don't have to change it in case we
// change the size of buf. -1 to leave space for the null terminator
int reader = read(fd,buf,sizeof(buf)-1);
if(reader < 0)
{
fprintf(stderr, "read failed: %s\n", strerror(errno));
close(fd);
return;
}
buf[reader] = 0; // add null terminator for safety
int i;
for (i=0; i < reader; i++)
{
printf("%i: I read: %c", i, buf[i]);
}