Считывание двоичного файла

У меня есть некоторые данные аналого-цифрового преобразователя, которые автоматически записываются в двоичный файл, который я хочу прочитать. В инструкции по эксплуатации, прилагаемой к устройству, есть пример кода C, который это сделает, но я попытался его использовать, и он не скомпилируется. Поскольку я впервые делаю что-то подобное или впервые использую C, мне нужна помощь.

В руководстве говорится: Файлы спектральных данных.CHN содержат канальное содержимое MCB в 32-разрядном целом числе. Заголовок имеет длину 32 байта. Следующая часть файла содержит спектр, хранящийся в виде 32-разрядных целых чисел. В файле нет разделителей записей. Количество записей спектра определяется количеством каналов в спектре. Данный код:

/*Sample program compatible with Microsoft and Borland C*/
/* to read header and channel data from a .CHN data file. */
#include <stdio.h>

#define .CHN -1

main(argc, argv)
  int argc;
  char *argv[];
{
    char acq_time[32]; /* buffer for time, date*/
    int f_type; /*.CHN file type*/
    unsigned int chan_offset,/* beginning channel number*/
    count, /*loop counter*/
    mca_num, /*1-4 are valid*/
    num_chans, /* no. of data channels*/
    num_writ, /* no. of bytes written out*/
    segment; /* segment number*/
    long int livetime, /*20 ms tics of livetime*/
    realtime, /*20 ms tics of realtime*/
    chan_data; /*stores channel data*/
    FILE *f_pointer;

    if(argc!=2){
        printf("USAGE: readchn filename.chn\n");
        exit(1);
    }

    f_pointer = fopen(argv[1], "rb");

    /* Header Data*/
    /* output header info from .CHN file*/
    /* read filetype -1 (.CHN) */

    fread(&f_type, sizeof(int), 1, f_pointer);
    if(f_type != .CHN) {
        printf("Not a valid file \n");
        return -1;
    }

    fread(&mca_num, sizeof(int), 1, f_pointer); /*MCA number*/
    fread(&segment, sizeof(int), 1, f_pointer); /* segment #*/
    fread(acq_time+12, sizeof(char), 1, f_pointer);/*start time*/
    fread(&realtime, sizeof(long), 1, f_pointer);/*20ms ticks*/
    fread(&livetime, sizeof(long), 1, f_pointer);/*20ms ticks*/
    fread(acq_time, sizeof(char), 2, f_pointer);/*start date*/
    fread(acq_time+2, sizeof(char), 3, f_pointer);/*start month*/
    fread(acq_time+5, sizeof(char), 3, f_pointer);/*start year*/
    fread(acq_time+8, sizeof(char), 2, f_pointer);/*start hour*/
    fread(acq_time+10, sizeof(char), 2, f_pointer);/*start mins*/
    fread(&chan_offset, sizeof(int), 1, f_pointer); /*offset*/
    fread(&num_chans, sizeof(int), 1, f_pointer); /*#channels*/

    printf("TYPE = %4i MCA# %2i\n", f_type, mca_num);
    printf("SEGMENT # %3i\n", segment);
    printf("REALTIME = %10li seconds\n", realtime/50);
    printf("LIVETIME = %10li seconds\n", livetime/50);

    printf("DATA COLLECTED AT ");
    fwrite(acq_time+8, sizeof(char), 2, stdout);
    putchar(':');
    fwrite(acq_time+10, sizeof(char), 2, stdout);
    putchar(':');
    fwrite(acq_time+12, sizeof(char), 2, stdout);

    printf("ON");
    fwrite(acq_time, sizeof(char), 2, stdout);
    putchar('-');
    fwrite(acq_time+2, sizeof(char), 3, stdout);
    putchar('-');
    fwrite(acq_time+5, sizeof(char), 2, stdout);

    printf("\nSTARTING CHANNEL = %6in", chan_offset);
    printf("\nNUMBER OF CHANNELS = %6i\n\n", num_chans);

    /* Channel Data*/
    /* Output channel data from .CHN file*/

    printf("CHANNEL DATA\n");
    for(count = 0; count < num_chans; count++){
        if((count % 6) ==0)
            printf("n%7i", count);
            fread(&chan_data, sizeof(long), 1, f_pointer);
            printf("%11i", chan_data);
            }
    fcloseall();
}

Данный код не будет компилироваться в XCode.

Учитывая структуру файла, есть ли способ посмотреть на файл (те, и нули) из командной строки? Я пытался с помощью

 xxd -b <filename>

но вывод не выглядит в соответствии с описанием файла, нет отдельного заголовка. Вот первые несколько строк вывода:

0000000: 11111111 11111111 00000001 00000000 00000001 00000000  ......
0000006: 00110001 00110001 10111101 11011101 00110011 00000000  11..3.
000000c: 01100111 01000100 00101100 00000000 00110010 00110011  gD,.23
0000012: 01000110 01100101 01100010 00110001 00110111 00110001  Feb171
0000018: 00110001 00110110 00110101 00110000 00000000 00000000  1650..
000001e: 00000000 00001000 00000000 00000000 00000000 00000000  ......
0000024: 00000000 00000000 00000000 00000000 00000000 00000000  ......
000002a: 00000000 00000000 00000000 00000000 00000000 00000000  ......
0000030: 00000000 00000000 00000000 00000000 00000000 00000000  ......

Любая помощь приветствуется!

0 ответов

Другие вопросы по тегам