C语言 While循环不能以eof结尾

bnlyeluc  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(172)

第一个
这是我的代码,当我看到result.txt时,它看起来像是输入文件的内容,一堆空值,输入文件的内容又出现了。所以它永远不会结束。我的代码有什么问题吗?谢谢。

cygmwpex

cygmwpex1#

如果你想让while((ch=buf_in())!= EOF)正常工作,你必须编写函数buf_in,当读取由于到达文件尾而失败时返回EOF。但是,你没有这样做。你忽略了read的返回值,所以你不会注意到什么时候到达了文件尾。
此外,char不保证能够表示值EOF。如果要确保数据类型能够表示值EOF,请改用int
您似乎以为EOF是出现在文件末尾的字符的字符代码。但事实并非如此。值EOF不是字符代码。它是由getchar、表示没有检索到字符。函数read不一定返回值EOF来表示文件结尾或错误。它使用不同的机制来报告此情况。它将返回成功读取的字节数,如果出错则返回-1。在某些平台上,值EOF可能等于值-1,但您不能依赖于此。
为了解决上面提到的问题,您可以将函数buf_in重写为:

int buf_in( void )
{
    if ( read_pos == 16 )
    {
        read_pos = 0;
        if ( read( fd_in, buffer_in, 16 ) == -1 )
            return EOF;
    }
    return (unsigned char)buffer_in[read_pos++];
}

转换为unsigned char是必要的,这样可以保证所有字符代码都可以与值EOF区分开来。
然而,这将不能适当地处理read仅阅读115字节之间的情况,而不是16字节。
因此,最好添加一个额外的变量ssize_t bytes_read,并将此变量初始化为0。然后,您可以使用以下代码:

int buf_in( void )
{
    if ( read_pos == bytes_read )
    {
        read_pos = 0;
        bytes_read = read( fd_in, buffer_in, 16 );
        if ( bytes_read == -1 )
            return EOF;
    }
    return (unsigned char)buffer_in[read_pos++];
}

请注意,还必须更改变量声明

char ch;

在函数main中,将

int ch;

因为我们已经将函数buf_in的返回值更改为int

相关问题