C用fread()读取二进制文件

时间:2015-06-07 21:42:13

标签: c file segmentation-fault fread

我试图用十六进制值从stdin读取文件:

0X0A

0x00 0x0a

0x61 0x00 0x61 0x00 0x0a

0x00 0x00 0x00

int i = 0;
unsigned char x = 0;        
            while(x != 0x0a && x != EOF){
                fread(&x, 1 , 1, stdin);
                tab[i] = x;
                i++;
            }

通过这个循环,我得到了最后一行的分段错误。

1 个答案:

答案 0 :(得分:1)

如果没有看到tab的声明,我们无法确定是什么触发了段错(很可能超出了对tab的限制)。

但是,您不应该使用fread stdin - fread来读取二进制文件,它将读取屏幕上每个字符的二进制表示形式。 您实际上正在读取字符的字节表示,与您正在执行x = getchar()scanf("%c", &x)

时几乎相同

所以你会读到“0x0a \ n0x00 0x0a \ n”等等。

现在,您正在根据0x0a的值对其进行测试,实际上是'\n',因此您可能无法读取第一行。

您想要做的是:

scanf("0x%x", &x);

将读取单个十六进制值,例如“0x0a”,然后您可以检查上面的常量。

另一件事 - 您已将x声明为unsigned char,但正在针对EOF进行测试,-1是一个int int。我很惊讶编译器没有在那里给你一个警告。您应该总是将值读入int,因此我将其重新声明为fread

此外,在读取二进制文件时(即使用fread),您将永远不会读取EOF值,因为这是在文件中找到的有效值。相反,如果已达到文件结尾,则feof(file)将返回0.您可以使用@animals检查是否已到达。