我尝试编写的程序应该能够读取长度不超过8个字符的字符串,并检查文件中是否存在这样的字符串。我决定为此使用“读取”系统功能,但是我想出了该功能的奇怪行为。正如它是手动编写的那样,到达文件末尾时它必须返回0,但是在我的情况下,当没有更多的字符可读取时,它仍然读取'\ n'并返回1(读取的字节数)(I'我们检查了读取字符的ASCII码,实际上是10,即'\ n')。因此,考虑到这一事实,我更改了代码并使其起作用,但我仍然不明白为什么它会以这种方式运行。这是我的函数的代码:
int is_present(int fd, char *string)
{
int i;
char ch, buf[9];
if (!read(fd, &ch, 1)) //file is empty
return 0;
while (1) {
i = 0;
while (ch != '\n') {
buf[i++] = ch;
read(fd, &ch, 1);
}
buf[i] = '\0';
if (!strncmp(string, buf, strlen(buf))) {
close(fd);
return 1;
}
if(!read(fd, &ch, 1)) //EOF reached
break;
}
close(fd);
return 0;
}
我认为您的问题出在内部read()
电话中。此处您没有检查函数的返回。
while (ch != '\n') {
buf[i++] = ch;
read(fd, &ch, 1);
}
如果文件在输入函数时恰好位于EOF且ch
等于EOF,'\n'
则它将是一个无限循环,因为read()
不会修改该ch
值。顺便说一句,您没有检查的界限buf
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句