所以,我在浏览文件时遇到了麻烦。
我想读这个文件;
1
0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0
0 0 0 2 0 0 0 0
0 0 0 2 1 0 0 0
0 0 1 2 2 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
第一个是我的播放器,而阵列是我的游戏板。
所以我试图用这段代码阅读所有这些:
void initialize_file(Game *game)
{
int i,j;
FILE *file = fopen("save.sav", "r");
if(file==NULL)
{
printf("Can't read file.... \n");
}
else
{
game->player=(fgetc(file)-'0');
printf("Player %d loaded\n",jeu->player);
fgetc(file); //jump the two lines after player
fgetc(file);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
Game->game[i][j] = (fgetc(file)-'0');
printf("value : %d \n",Game->game[i][j]);
fgetc(file);
}
fgetc(file);
}
}
}
我的问题是我有时会获得数组之外的值,如-16和-38,它们分别引用Space和LF。 所以我的问题是:我怎么能避免跑到这些-16和-38?
非常感谢,我很抱歉任何英语错误
答案 0 :(得分:2)
每次使用前c = fgetc(..)
检查c != EOF
和isdigit(c)
。
明智的话,c
应该是int
。但当然每个人都知道这一点。
答案 1 :(得分:0)
在每一行的最后一个值之后是否存在空白?
如果行以'0\n'
而不是'0 \n'
结束,则内循环中fgetc
的调用将在循环第一次终止时读取\n
,并且外部循环将读取下一个字符。这将导致算术多次' ' - '0'
,在使用与ASCII兼容的字符编码的系统上32-48 = -16
。
同样,'\n' - '0'
为10-48 = -38
。您的问题是每行的最后一个数字后面没有空格。
在保存游戏板时在\n
之前输出空白或删除fgetc
的最后一次调用,因为内循环已经读取\n
。
修改:在cnicutar responded时,您还应检查返回值。