Считывание двоичного файла
У меня есть некоторые данные аналого-цифрового преобразователя, которые автоматически записываются в двоичный файл, который я хочу прочитать. В инструкции по эксплуатации, прилагаемой к устройству, есть пример кода 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 ......
Любая помощь приветствуется!