C-读二进制文本文件是对的吗?

时间:2014-08-27 12:06:42

标签: c malloc header-files binaryfiles

我是C语言的初学者。

我正在尝试读取二进制txt文件。

当我直接打开txt文件时,我看到了它

  
      
  • 젂8F? ?㎲잤öタSP쑴톧숴沛=)麴퓠5 R오쏠AD풠-V욕Ç珞|붆拂쟬v ????걀신v @n풶1C퓋>?!????2 P琏> 5쾳엥V壤뾅甲癣甲αW?   殆퀃[??픫퇡원퓅V맙°쐴??阁W¯¯条>有?????????걬벩3쁂횖升젖옜鹦d乍涌H 19伽ý뤍XK묠RT테 ?@숦?vY햙y?kz'?n?6注웍Qt ?? *풯?인$ ???쾹y옇왯?L쁂碻?祠녋Dm +작\薮왱여?픻9c욋??출풛궭母?좣?孔8퓎뒜C =瑾A ?? +샓?쇏岫岫岫j j풖풖풖풖앝앝앝????????????_ _ _ _? ????2及풰Еü윰我녉ü푂풧+쁂 - 晖甲伦겵헳퐉LG퓾닆욋ⓨ풇짡믳빢쨒榕:@뺠쏱요p殆쩋쁂中号됆A 10욢?????? ?돽p瑥푢
  •   

是的,txt文件中的内容似乎很奇怪,因为它呈现了二进制文件。

该文件由标题和数据组成。

标题是

  

nSamples - 文件中的样本数(4字节整数)

     

sampPeriod - 以100ns为单位的采样周期(4字节整数)

     

sampSize - 每个样本的字节数(2字节整数)

     

parmKind - 表示样本种类的代码(2字节整数)

和4byte float类型的数据部分。

我的代码在Header部分确实做得很好。

但我不知道为什么数据部分会变得更糟。

我的代码中的数据部分似乎有误,因为除了data [0]

之外,它们具有相同的值

实际上,它们都有不同的价值。

 #include <stdio.h>
 #include <stdlib.h> // exit()



  int main(void) 
  {

    FILE *a;



    int abc=1;
    int ch;
    int size;
    int k;

    float* data;
    long* nSamples;
    long* sampPeriod;
    short* sampSize;
    short* sampKind;

    nSamples=(long*) malloc(sizeof(long));
    sampPeriod=(long*) malloc(sizeof(long));
    sampSize=(short*) malloc(sizeof(short));
    sampKind=(short*) malloc(sizeof(short));
    data=(float*) malloc(sizeof(float)*10);
    //I Just wanted to check a few values 

    if ( (a = fopen("noalter.txt", "rb")) == NULL ) {
      fputs("error!", stderr);
      exit(1);
    }

    fread(nSamples,sizeof(long),1,a);
    fread(sampPeriod,sizeof(long),1,a); 
    fread(sampSize,sizeof(short),1,a); 
    fread(sampKind,sizeof(short),1,a);

    fread(data,sizeof(float),1,a);
    fread(data,sizeof(float),1,a);
    fread(data,sizeof(float),1,a);

    printf("%ld \n",nSamples[0]);
    printf("%ld \n",sampPeriod[0]);
    printf("%d \n", sampSize[0]);
    printf("%d \n", sampKind[0]);
    printf("%f \n", data[0]);
    printf("%f \n", data[1]);
    printf("%f \n", data[2]); //I Just wanted to check a few values 


    fclose(a); 
    free(nSamples);
    free(sampPeriod);
    free(sampSize);
    free(sampKind);

    return 0;
  }

2 个答案:

答案 0 :(得分:3)

在阅读数据时,您会三次读取data的相同位置。你应该这样做。

fread(&data[0], sizeof(data[0]), 1, a);
fread(&data[1], sizeof(data[1]), 1, a);
fread(&data[2], sizeof(data[2]), 1, a);

或者只阅读您分配的所有十个条目:

fread(data, sizeof(data[0]), 10, a);

答案 1 :(得分:0)

如果您使用Linux,也可以使用 cat 命令使用二进制文件的内容。