读取普通文件

问题描述

| 我正在编写一个程序,该程序从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;
}