我有一个包含多个记录的文件。每个记录包含一个类型(一个二进制值数字),len(再次为bin值)和一个data(长度为len的二进制值)。该文件包含多个记录。我想打印包含它自己的类型,len和数据的每条记录。
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
typedef struct file_s {
int16_t type;
int32_t length;
// Assumption: Each record is 16 bits
// For a record size of 32 bits, use int32_t*
int16_t* data;
} file_s;
int main() {
file_s file;
FILE* f = fopen("file.bin","r");
if (f == NULL) {
perror("Error");
return 1;
}
fread(&file.type, sizeof(file.type), 1, f);
fread(&file.length, sizeof(file.length), 1, f);
file.data = malloc(file.length * sizeof(*file.data));
fread(file.data, sizeof(*file.data), file.length, f);
fclose(f);
// Process the data
/* ... */
free(file.data);
return 0;
}
如何循环浏览文件并打印每条记录。
答案 0 :(得分:-1)
这个想法是每次检查fread的返回值,如果返回值小于期望值,则检查feof()以查看是否到达文件末尾。您可以通过Google“ man fread”和“ man feof”检查手册页。您可以使用do while循环遍历文件。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
int feof(FILE *stream);
类似:
while(1) {
size_read = fread(&file.type, sizeof(file.type), 1, f);
if(size_read!=1 || feof(f))
break;
fread(&file.length, sizeof(file.length), 1, f);
//do the same check
file.data = malloc(file.length * sizeof(*file.data));
fread(file.data, sizeof(*file.data), file.length, f);
//do the same check, remember to free the memory!
}