C语言结尾后的麻烦

时间:2014-02-01 18:33:43

标签: c file fgetc

所以,我在浏览文件时遇到了麻烦。

我想读这个文件;

    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?

非常感谢,我很抱歉任何英语错误

2 个答案:

答案 0 :(得分:2)

每次使用前c = fgetc(..)检查c != EOFisdigit(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时,您还应检查返回值。