我有以下结构
struct
{
char order;
int row;
int column;
int length;
char printChar;
}record;
我的文件看起来像这样
F
30
40
7
X
我如何使用fread将文件存储在struct中? 我的文件是否正确显示,或者所有组件是否需要单行?
答案 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
并读取每一行并将数据分配到结构中(如果错误检查,则根据需要使用strtol或atoi等函数转换数值并不重要。)
答案 2 :(得分:0)
您的文件似乎是一个文本文件,因此,如果这正是文件的格式,您可以使用fscanf
:
fscanf(file, "%c%d%d%d%c", &(record.order), &(record.row), ...
如果您对基本错误处理感兴趣,可以检查返回值。如果您需要更好地描述错误,只需使用fgets
一次读取一行,然后使用sscanf
,atoi
,strtol
和类似函数进行解析。< / p>
如果你想直接在结构中保存数据,不,你不能(使用那种文件),在文本文件中30
是一个由两个字符组成的字符串,而不是二进制形式的整数