【发布时间】:2015-06-12 19:00:39
【问题描述】:
我正在尝试使用 fscanf 为结构数组加载一些默认值,类似于
#define NUMPIECES 21
typedef struct{
short map[5][5];
short rotation;
short reflection;
} mytype_t;
typedef struct{
mytype_t p[NUMPIECES];
} mytypelist_t;
数据存储在文本文件中,如下所示(以不同的值重复多次):
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
1 2
[...]
我正在使用 fscanf / fscanf_s 读取值(两者都尝试过),如下所示:
mytypelist_t list;
FILE * f;
[...]
for (i=0; i<NUMPIECES; i++){
for (j=0; j<5; j++){
fscanf(f,"%d%d%d%d%d", &(list->p[i].map[j][0]),
&(list->p[i].map[j][1]),
&(list->p[i].map[j][2]),
&(list->p[i].map[j][3]),
&(list->p[i].map[j][4]));
}
fscanf(f,"%d %d", &(list->p[i].rotations), &(list->p[i].reflection));
}
但是,VS2012 最后抛出了一个异常,说列表已损坏。调试显示,在阅读了上面示例文本的前四行之后,struct的“map”部分包含以下内容
map = [ 0 0 0 0 0 ]
[ 0 0 0 0 0 ]
[ 0 0 1 0 0 ]
[ 0 0 0 0 0 ]
[ 0 X X X X ]
其中 X 是未初始化的值。
似乎 fscanf 正在尝试“空终止”我的整数数组或类似的数组,并且正在覆盖后续行的第一个元素。我之所以发现它,是因为 VS 在退出时抛出了异常——否则数据会被完美读取(额外的 0 会被下一次 fscanf 调用覆盖)。
这是 fscanf 的副产品吗?还是我忽略了一个错误?
(在 VS2012 上编译/测试)
【问题讨论】:
-
您已将
mytype_t.map声明为 5x5,但您的示例文本文件为 4x5。那是错字吗?如果不是,那是你的问题。fscanf()正在尝试从一行中读取 5 个整数,但只有 2 个可用。