如何从二进制文件读入struct c?

时间:2012-12-19 18:01:04

标签: c file

我有以下结构

struct
{
    char order;
    int row;
    int column;
    int length;
    char printChar;
}record;

我的文件看起来像这样

F
30
40
7
X

我如何使用fread将文件存储在struct中? 我的文件是否正确显示,或者所有组件是否需要单行?

3 个答案:

答案 0 :(得分:6)

如果我理解正确,你会问你是否可以

struct record r;
fread(file, &r, sizeof(r));

或者你被迫使用

struct record r;
fread(file, &r.order, sizeof(r.order));

如果这是您的问题,那么答案是:您必须逐个读取字段,因为结构成员之间可能存在填充。或者,如果您使用与GNU兼容的编译器,您可以通过将结构声明为“packed”来指示它不要包含任何填充:

struct record {
    // ...
} __attribute__((packed));

但除非绝对必要,否则不建议这样做(不可移植)。

另外,您的文件真的是二进制文件吗?如果没有,您应该注意换行符并将数字从文本转换为实际数值。

答案 1 :(得分:1)

无法从该格式的文件(基本上包含数据的字符表示)中读取到结构中。读取它的一种方法是使用fgets并读取每一行并将数据分配到结构中(如果错误检查,则根据需要使用strtolatoi等函数转换数值并不重要。)

答案 2 :(得分:0)

您的文件似乎是一个文本文件,因此,如果这正是文件的格式,您可以使用fscanf

fscanf(file, "%c%d%d%d%c", &(record.order), &(record.row), ...

如果您对基本错误处理感兴趣,可以检查返回值。如果您需要更好地描述错误,只需使用fgets一次读取一行,然后使用sscanfatoistrtol和类似函数进行解析。< / p>

如果你想直接在结构中保存数据,不,你不能(使用那种文件),在文本文件中30是一个由两个字符组成的字符串,而不是二进制形式的整数