2011-05-24 50 views
3

我正在做一个程序,从标准输入在文件中读取,做了它,并将它发送到stdout。阅读一般的文件

既然这样,我在我的程序行:

while((c = getchar()) != EOF){ 

其中c是一个int。

但是问题是我想使用ELF可执行此程序。它似乎有必须是代表可执行文件,这会导致它被截断(纠正我,如果我错了这里 - 这只是我的假设)内ASCII文件EOF字节。

什么是去这样做有效一般方式?我可以挖掘ELF格式的文件,然后检查最后发生的情况。这将是有用的,但我认为如果我仍然可以将此程序应用于任何类型的文件会更好。

+2

你的假设是错误的。这是读取流的标准方式。 – 2011-05-24 16:22:17

+0

你为什么要使用stdin?这意味着你会做prog <文件。使用prog文件然后自己读取文件有什么问题?可执行文件将包含各种值,而不仅仅是ASCII。 – ColWhi 2011-05-24 17:07:15

+0

@Sasquiha Eh?也许他想写一个过滤器。这就是UNIX命令应该工作的方式。 – 2011-05-24 17:19:41

回答

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

你可能想要去一个低一点的水平,并使用系统功能,如打开(),close()方法和read() ,这样你可以对输入做你喜欢的事情,因为它会被存储在你自己的缓冲区中。

0

从的getchar(3)手册页:

字符值返回为转换为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; 
} 
1

你正确地做到了这一点。

EOF不是字符。有没有办法c将EOF代表流中的任何字节。如果/当c确实包含EOF时,该特定值不是源自文件本身,而是源自底层库/ OS。 EOF是出现问题的信号。

确保cint虽然

哦......你可能希望从你的操控下一个流中读取。在没有其他代码的情况下,stdin受到“文本翻译”的影响,这在读取二进制数据时可能不合意。

FILE *mystream = fopen(filename, "rb"); 
if (mystream) { 
    /* use fgetc() instead of getchar() */ 
    while((c = fgetc(mystream)) != EOF) { 
     /* ... */ 
    } 
    fclose(mystream); 
} else { 
    /* error */ 
}