关于C语言中fread函数的问题?

有一个文件1.dic,里面有随便一个数,比如说100。
按照我下面的代码读文件为什么不对呢?a的值输出来是3158065。
另外如果文件里面有几个未知长度的字符串,我怎么读呢?


#include<stdio.h>
int main()
{
    int a;
    FILE *fp=NULL;
    if((fp=fopen("1.dic","rb"))==NULL){
        printf("fail to open file!\n");
        return 0;
    }
    fread(&a, sizeof(a), 1, fp);
    printf("%d", a);
    fclose(fp);
    return 0;
}

老程序员给你举个例子吧:


//二进制方式打开文件  
    fp = fopen("lining.txt","rb");  
    if(NULL == fp)  
    {  
        printf("Error:Open input.c file fail!\n");  
        return;  
    }  
  
    //求得文件的大小  
    fseek(fp, 0, SEEK_END);  //文件光标定位到末尾
    size = ftell(fp);  //获取大小
    
  
    //申请一块能装下整个文件的空间  
    ar = (char*)malloc(sizeof(char)*size);  
  
    //读文件  
    fread(ar,1,size,fp);//每次读一个,共读size次  
  
    printf("%s",ar);  //如果输出如同你的100,转换成整形就好

在文件里面的是不可能是整形的,都是字符串,你需要获取整数值的话只能进行强制类型转换了

试试格式读入:fscanf(fp, "%d\n", &a);

3158065 = 0x303031,对应的是ascii码的字符串"100"。所以,你的文件是文本格式。而fread读取的是二进制字节流.
你的文本文件对应的二进制字节: 0x31, 0x30, 0x30.
int在x86机型的中按低位在前的顺序存储,得到整数就 0x303031 = 3158065 .

读字符串格式的数字,应该用fscanf.


#include<stdio.h>
int main()
{
    char a[10];
     FILE *fp = NULL;
     if ((fp = fopen("1.dic", "rb")) == NULL) {
         printf("fail to open file!\n");
         return 0;
     }
     fread(a, sizeof(int), 1, fp);
     printf("%d", atoi(a));
     fclose(fp);
     return 0;
}

fread读出来的是字符串“100”,放到内存就是0x30 0x30 0x31,所以int a 四个字节里面存的是0x31 0x30 0x30,也就是 00110001 00110000 00110000,大小端转换后00110000 00110000 00110001 = 3158065。定义char buff[1024],然后while循环读取到buff里面, 在strtok去截取字符串串,然后转成你想要的类型,什么atoi atof 什么的,或者自己解析。

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。