关于C#:如何使用fread从二进制文件读取整数?

How do I read an integer from a binary file using fread?

我意识到更大的文件失败了,因为它无法正确读取二进制文件中的第一个整数。 这是我为此设置的测试文件。 我知道我正在读取的int始终为1个字节,因此我将数据读取为char型,然后将其转换为short型。 它在过去的某个时候可以正常工作,但是在清理代码时我以某种方式弄乱了它。

此时程序正在打印

"整数是127"

什么时候应该打印

"整数是1"

有人知道为什么会这样吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){
    FILE *inp;
    char r;
    short i;

    if ((inp = fopen(argv[0],"r")) == NULL){
    printf("could not open file %s for reading
"
,argv[1]);
    exit(1);}

    fread((void *)&r,(size_t) 1,(size_t) 1, inp);
    i = (short)r;

    printf("The integer is %d
"
,i);        
}


您应该像这样调用fread来读取int

1
2
int num;
fread(&num, sizeof(int), 1, inp);

另外,最好检查返回值,如果成功,返回值应为1:

1
2
3
4
#incude <errno.h>
errno = 0;
if(fread(&num, sizeof(int) 1, inp) != 1)
    strerror(errno);

编辑

如果要读取的值只有8位,则应使用unsigned char进行读取,如下所示:

1
2
unsigned char num;
fread(&num, 1, 1, inp);


fopen(argv[0],"r"),但报告打开argv[1]时出错。 打开程序进行阅读是不正常的(尽管如果风向右吹并且月相正确,您可能会摆脱它)。

您打算使用以下机会:

1
2
3
4
if (argc != 2)
    …report usage…
if ((inp = fopen(argv[1],"r")) == NULL)
    …report error…

另外,在行尾的}(如exit(1);}中)是一个非常奇怪的布局约定。 就个人而言,我讨厌它。 幸运的是,我只能在SO上看到它。