gpt4 book ai didi

c - 'read'系统函数的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 15:14:09 26 4
gpt4 key购买 nike

我尝试编写的程序应该能够读取长度不超过 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 等于 '\n' 那么这将是一个无限循环,因为 read( ) 不会修改 ch 值。顺便说一句,您没有检查 buf 的边界。

关于c - 'read'系统函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34155695/

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