我有一个包含多条记录的文件。每条记录包含一个类型(一个二进制值数字)、len(又是bin值)和数据(长度为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;
}
如何循环遍历文件并打印每条记录。
最佳答案
想法是每次检查fread的返回值,如果返回值小于预期,则检查feof()以查看是否到达文件末尾。您可以通过谷歌“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!
}
关于c - 循环遍历文件并读取所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55035324/