所以,我在读取文件时遇到问题。
我想读这个文件;
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
第一个 1 是我的播放器,而数组是我的游戏板。
所以我正在尝试使用以下代码阅读所有这些:
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 loadedn",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 ?
非常感谢,对于任何英语错误,我提前
道歉每次执行c = fgetc(..)
请在使用前检查c != EOF
并isdigit(c)
。
对智者的话,c
应该是一个int
.但当然每个人都知道这一点。
每行最后一个值之后是否存在空白?
如果该行以'0n'
而不是'0 n'
结尾,则内部循环中对fgetc
的调用将在循环第一次终止时读取n
,外部循环将读取下一个字符。这将导致您的算术多次产生' ' - '0'
,这在使用与 ASCII 兼容的字符编码的系统上32-48 = -16
。
同样,'n' - '0'
10-48 = -38
.您的问题是每行的最后一个数字后面没有空格。
保存游戏板时,要么在n
之前输出一个空白,要么删除上次调用fgetc
,因为内部循环已经读取了n
。
编辑:当 cnicutar 响应时,您还应该检查您的返回值。