2014-02-01 3 views
0

Итак, у меня проблемы с чтением из файла.Чтение неисправностей после окончания строки в C

Я хочу прочитать этот файл;

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 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, которые относятся друг к космосу и LF , Итак, мой вопрос: как я мог избежать бегства к этим -16 и -38?

Спасибо много, и я извиняюсь заранее за любые ошибки английских

ответ

0

Существует ли пробел после последнего значения на каждой строке?

Если линия заканчивается '0\n' вместо '0 \n', призывание fgetc во внутреннем цикле будет считывать \n в первый раз цикл завершается, и внешний цикл будет читать следующий символ. Это приведет к тому, что ваша арифметика приведет к ' ' - '0' много раз, то есть 32-48 = -16 в системе, которая использует кодировку символов, совместимую с ASCII.

Аналогичным образом, '\n' - '0' является 10-48 = -38. Ваша проблема в том, что за последним номером на каждой строке не следует пробел.

Либо выведите пробел перед \n, когда вы сохраните игровое поле или удалите последний вызов fgetc, так как внутренний контур уже читает \n.

Редактировать: Как cnicutar responded, вы также должны проверить свои возвращаемые значения.

+0

Спасибо! Я добавил пробел перед \ n, и теперь он работает нормально. Я проверю свои возвращаемые значения, как сказал cnicutar. Благодаря ! –

2

Каждый раз, когда вы делаете c = fgetc(..) проверку c != EOF и isdigit(c) перед его использованием.


Слово к мудрым, c должен быть int. Но, конечно, все это знали.

Смежные вопросы