如何解决读取普通文件
| 我正在编写一个程序,该程序从stdin读取文件,对其进行处理并将其发送到stdout。 就目前而言,我的程序中有一行:while((c = getchar()) != EOF){
其中c
是整数。
但是问题是我要在ELF可执行文件上使用此程序。似乎在可执行文件中必须有一个字节代表ESC的ascii文件,这导致它被截断(如果我错了,请纠正我-这只是我的假设)。
执行此操作的有效一般方法是什么?我可以按照ELF格式提取文档,然后检查末尾是否有任何内容。那将很有用,但是我认为如果我仍然可以将该程序应用于任何类型的文件,那就更好了。
解决方法
没关系-
EOF
常量不包含有效的ASCII值(通常为-1
)。
例如,以下是我的系统中ѭ4的摘录:
/* End of file character.
Some things throughout the library rely on this being -1. */
#ifndef EOF
# define EOF (-1)
#endif
,您可能想降低一点,并使用open(),close()和read()之类的系统函数,这样您就可以对输入执行任何操作,因为它将存储在您自己的缓冲区中。
,您做得正确。
EOF不是字符。 ѭ1不可能有EOF来表示流中的任何字节。如果/当“ 1”确实包含EOF时,该特定值不是源自文件本身,而是源自基础库/ OS。 EOF表示出现问题。
确保c
是int
哦...,您可能想在您的控制下读取流。在没有其他代码的情况下,“ 10”受“文本翻译”的约束,这在读取二进制数据时可能是不希望的。
FILE *mystream = fopen(filename,\"rb\");
if (mystream) {
/* use fgetc() instead of getchar() */
while((c = fgetc(mystream)) != EOF) {
/* ... */
}
fclose(mystream);
} else {
/* error */
}
,在getchar(3)手册页中:
字符值作为
unsigned char转换为int。
这意味着,通过getchar读取的字符值永远不能等于有符号整数-1。这个小程序解释了它:
int main(void)
{
int a;
unsigned char c = EOF;
a = (int)c;
//output: 000000ff - 000000ff - ffffffff
printf(\"%08x - %08x - %08x\\n\",a,c,-1);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。