我正在创建一个从stdin读取文件的程序,对它执行某些操作并将其发送到stdout。
按照目前的情况,我的程序中有一行:
while((c = getchar()) != EOF){
其中c
是一个int。
但是问题是我想在ELF可执行文件上使用这个程序。而且似乎必须有一个字节代表可执行文件中的ascii文件的EOF,这会导致它被截断(如果我在这里错了,请纠正我 - 这只是我的假设)。
有效的一般方法是做什么的?我可以在ELF格式上挖掘文档,然后检查最后的内容。这将是有用的,但我认为如果我仍然可以将此程序应用于任何类型的文件会更好。
答案 0 :(得分:3)
你会没事的 - EOF
常量不包含有效的ASCII值(通常是-1
)。
例如,以下是我系统上stdio.h
的摘录:
/* End of file character.
Some things throughout the library rely on this being -1. */
#ifndef EOF
# define EOF (-1)
#endif
答案 1 :(得分:1)
您可能希望使用较低级别并使用open(),close()和read()等系统函数,这样您就可以使用输入执行所需操作,因为它将存储在您自己的缓冲区中
答案 2 :(得分:1)
你正确地做到了。
EOF不是字符。 c
无法使用EOF表示流中的任何字节。如果/ c
确实包含EOF,则该特定值不是来自文件本身,而是来自底层库/ OS。 EOF是一个出错的信号。
确保c
为int
但
哦......你可能想要从你控制的流中读取。如果没有其他代码,stdin
会受到“文本翻译”的影响,这在阅读二进制数据时可能并不理想。
FILE *mystream = fopen(filename, "rb");
if (mystream) {
/* use fgetc() instead of getchar() */
while((c = fgetc(mystream)) != EOF) {
/* ... */
}
fclose(mystream);
} else {
/* error */
}
答案 3 :(得分:0)
来自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;
}