阅读一般文件

时间:2011-05-24 16:19:20

标签: c unix

我正在创建一个从stdin读取文件的程序,对它执行某些操作并将其发送到stdout。

按照目前的情况,我的程序中有一行:

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

其中c是一个int。

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

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

4 个答案:

答案 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是一个出错的信号。

确保cint

哦......你可能想要从你控制的流中读取。如果没有其他代码,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;
}