读取二进制文件c

时间:2014-01-31 14:22:57

标签: c file binary

所以基本上我有这种结构的二进制文件

struct data{
char name[30];
char name2[30];
};

我想从文件中读回数据结构数组,但问题是我不知道这个文件中有多少条记录。有人可以解释我怎么能读出整个文件而不是内部的记录?

2 个答案:

答案 0 :(得分:4)

您可以打开文件,检查它的大小:

fseek(fp, 0L, SEEK_END); // Go at the end
sz = ftell(fp);          // Tell me the current position
fseek(fp, 0L, SEEK_SET); // Go back at the beginning

内部的记录数量为:

N = sz/sizeof(struct data);

无论如何,要小心,如果你只是将一个结构数组写入文件,由于不同的内存对齐,它可能无法被其他机器读取。您可以使用__attribute__((packed))选项来确保结构相同(但它是GCC特定的扩展,而不是标准C的一部分)。

struct __attribute__((packed)) data {
    char name[30];
    char name2[30];
};

答案 1 :(得分:0)

内存映射文件是最好的选择。

int fd = open(filename, O_RDONLY);
struct stat fdstat;
fstat(fd, &fdstat);
struct data * file_contents = mmap(NULL, fdstat.st_size
     , PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

// assuming the file contains only those structs
size_t num_records = fdstat.st_size / sizeof(*file_contents);

智能操作系统将在首次使用时从文件中加载数据,并从最近未访问过的内存中逐出。