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



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

0 x0a

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++;
            }

与此循环,我得到分割错误与最后一行。

如果没有看到tab的声明,我们就不能确定是什么触发了段错误(很可能是对tab的越界访问)。

然而,你不应该使用freadstdin - fread是读取二进制文件,它将读取屏幕上每个字符的二进制表示。你实际上是在读取一个字符的字节表示形式,就像你在x = getchar()scanf("%c", &x)

所以你会读到"0x0an0x00 0x0an"等等

现在,您正在针对0x0a的值进行测试,该值实际上是'n',因此您可能不会读取超过第一行的内容。

你要做的是:

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

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

另一件事-你已经声明x为unsigned char,但正在测试它对EOF,这是一个int, -1。我很惊讶编译器没有给你一个警告。你应该总是把这个值读入int类型,所以我将它重新声明为int

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

相关内容

  • 没有找到相关文章

最新更新