第一个这是我的代码,当我看到result.txt时,它看起来像是输入文件的内容,一堆空值,输入文件的内容又出现了。所以它永远不会结束。我的代码有什么问题吗?谢谢。
cygmwpex1#
如果你想让while((ch=buf_in())!= EOF)正常工作,你必须编写函数buf_in,当读取由于到达文件尾而失败时返回EOF。但是,你没有这样做。你忽略了read的返回值,所以你不会注意到什么时候到达了文件尾。此外,char不保证能够表示值EOF。如果要确保数据类型能够表示值EOF,请改用int。您似乎以为EOF是出现在文件末尾的字符的字符代码。但事实并非如此。值EOF不是字符代码。它是由getchar、表示没有检索到字符。函数read不一定返回值EOF来表示文件结尾或错误。它使用不同的机制来报告此情况。它将返回成功读取的字节数,如果出错则返回-1。在某些平台上,值EOF可能等于值-1,但您不能依赖于此。为了解决上面提到的问题,您可以将函数buf_in重写为:
while((ch=buf_in())!= EOF)
buf_in
EOF
read
char
int
getchar
-1
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仅阅读1和15字节之间的情况,而不是16字节。因此,最好添加一个额外的变量ssize_t bytes_read,并将此变量初始化为0。然后,您可以使用以下代码:
unsigned char
1
15
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中,将
main
int ch;
因为我们已经将函数buf_in的返回值更改为int。
1条答案
按热度按时间cygmwpex1#
如果你想让
while((ch=buf_in())!= EOF)
正常工作,你必须编写函数buf_in
,当读取由于到达文件尾而失败时返回EOF
。但是,你没有这样做。你忽略了read
的返回值,所以你不会注意到什么时候到达了文件尾。此外,
char
不保证能够表示值EOF
。如果要确保数据类型能够表示值EOF
,请改用int
。您似乎以为
EOF
是出现在文件末尾的字符的字符代码。但事实并非如此。值EOF
不是字符代码。它是由getchar
、表示没有检索到字符。函数read
不一定返回值EOF
来表示文件结尾或错误。它使用不同的机制来报告此情况。它将返回成功读取的字节数,如果出错则返回-1
。在某些平台上,值EOF
可能等于值-1
,但您不能依赖于此。为了解决上面提到的问题,您可以将函数
buf_in
重写为:转换为
unsigned char
是必要的,这样可以保证所有字符代码都可以与值EOF
区分开来。然而,这将不能适当地处理
read
仅阅读1
和15
字节之间的情况,而不是16
字节。因此,最好添加一个额外的变量
ssize_t bytes_read
,并将此变量初始化为0
。然后,您可以使用以下代码:请注意,还必须更改变量声明
在函数
main
中,将因为我们已经将函数
buf_in
的返回值更改为int
。