“读取”系统功能的奇怪行为

弗拉迪斯拉夫·科列斯尼科夫(Vladislav Kolesnikov)

我尝试编写的程序应该能够读取长度不超过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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章