1

我有以下结构

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

我的文件看起来像这样

F
30
40
7
X

我如何使用 fread 将文件存储在结构中?我的文件是否正确显示,还是所有组件都需要在一行中?

4

3 回答 3

8

如果我理解正确,您是在问是否可以

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

还是你被迫使用

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

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

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

但除非绝对必要,否则不建议这样做(它不是便携式的)。

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

于 2012-12-19T18:04:39.127 回答
1

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

于 2012-12-19T18:04:25.630 回答
0

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

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

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

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

于 2012-12-19T18:11:10.057 回答