使用fscanf读取序列化数据

时间:2013-03-08 03:16:52

标签: c scanf

我有一个C结构数组,我将它序列化为一个文件,我需要再次将该数据重新存入内存。

movie list[50]; //array

typedef struct{
    int code;
    int year;
    float price;
    char title[50];
    char director[30];
    char description[255];
} movie;

序列化数据示例

1|1990|9.900000|Hello world|Foo bar baz|lorem ipsum bla bla|
34|1994|4.900000|lorem ipsum|lorem ipsum|lorem ipsum|
23|1993|5.100000|lorem ipsum|lorem ipsum|lorem ipsum|
.
.
.

要序列化我只是遍历数组并将每个属性fprintf到一行。

但要阅读数据显然不起作用

while( fscanf("%d|%d|%f|%s|%s|%s|",&list[i].code, &list[i].year, ...)!= EOF){
i++;
...
}

2 个答案:

答案 0 :(得分:3)

这不起作用

sscanf(input,"%[ˆ|]|%[ˆ|]|%[ˆ|]",string1,string2,string3);

错误是如此微妙,我花了将近3个小时才找到问题的答案:

sscanf(input,"%[^|]|%[^|]|%[^|]",string1,string2,string3);

问题可能是因为我在美国的macbook上使用U.S International English布局键盘。

这导致^键(Shift-6)显示为重音ˆ,直到您按下辅音变为â ê î ô û或者如果按空格键,它会将重音变为一个角色,我从未意识到这两个ˆ^是不同的。

我不太确定英语,但至少在葡萄牙语中,不是一个字符被称为抑扬音,用于辅音toû来代表不同的发音。

因此,如果您使用美式键盘,则必须按Shift + 6然后按空格键才能生成^

答案 1 :(得分:1)

“明显不起作用”......当你阅读该函数的联机帮助页时: - (。

%s格式在点击|时不会停止读取字符串...如果查看fscanf文档,您会看到另一种格式说明,允许您控制哪些字符被读入字符串与终止转换....