我试图用十六进制值从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++;
}
通过这个循环,我得到了最后一行的分段错误。
答案 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
检查是否已到达。