如何使用fread从二进制文件中读取整数?

时间:2014-03-03 00:39:29

标签: c fread

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

此时程序正在打印

“整数是127”

应该打印时

“整数是1”

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

#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\n",argv[1]);
    exit(1);}

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

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

2 个答案:

答案 0 :(得分:3)

您应该像这样致电fread来阅读int

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

此外,检查返回值是明智的,如果在您的情况下成功,则应为1:

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

修改

如果您正在阅读的值仅为8位,则应使用unsigned char进行读取,如下所示:

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

答案 1 :(得分:2)

fopen(argv[0], "r"),但报告错误开放argv[1]。打开你的阅读程序是不正常的(虽然如果风吹得正确,月亮的相位是正确的,你可能会侥幸逃脱)。

您打算使用的机会:

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

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