所以基本上我有这种结构的二进制文件
struct data{
char name[30];
char name2[30];
};
我想从文件中读回数据结构数组,但问题是我不知道这个文件中有多少条记录。有人可以解释我怎么能读出整个文件而不是内部的记录?
答案 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);
智能操作系统将在首次使用时从文件中加载数据,并从最近未访问过的内存中逐出。