2016-03-22 2 views
0

В следующем коде я пытаюсь прочитать char по char из файла и хранить каждый символ в двухмерном массиве. После этого я хочу напечатать каждый символ в массиве с его координатами (I и J):C печать массива из двух измерений

#include <stdio.h> 
#pragma warning(disable:4996) 
int main(){ 

    char grid[3][5]; 
    FILE *file; 
    file = fopen("input.txt", "r"); 
    int c; 

    if (file == NULL){ 
     perror("Error in reading the file"); 
    } 
    else{ 
     int j=0; 
     for (int i = 0; i < 3; i++) 
     { 
      while (j<5) 
      { 
       grid[i][j] = fgetc(file); 
       j++; 
      } 
      j = 0; 
     } 
    } 

    int length = sizeof grid/sizeof grid[0][0]; 
    for (int i = 0; i < 3; i++) 
    { 
     for (int j = 0; j < 5; j++) 
     { 
      printf("%c %d %d \n", grid[i][j], i, j); 

     } 
    } 
    printf("\n"); 
    return 0; 
} 

Файл, который я прочитал из выглядит как:

ABCDE 
FGHIJ 
KLMNO 

Я хочу, чтобы результат как :

A 0 0 
B 0 1 
... 

Но реальные результаты, которые я получил это:

A 0 0 
B 0 1 
C 0 2 
D 0 3 
E 0 4 

1 0 
F 1 1 
G 1 2 
H 1 3 
I 1 4 
J 2 0 

2 1 
K 2 2 
L 2 3 
M 2 4 

Как вы можете видеть, вторая строка печатается с пространством первой и той же с третьей строкой. Кроме того, последние две буквы N и O не печатаются. Может ли кто-нибудь помочь мне решить эту проблему?

+2

Вы читаете два '\ n' в качестве символов, которые выталкивают последние два элемента вашего массива' char'. –

+0

Измените содержимое своего файла на 'ABCDEFGHIJKLMNO' и он должен работать правильно. –

ответ

2

Изменить этот бит кода

for (int i = 0; i < 3; i++) 
{ 
    while (j<5) 
    { 
     grid[i][j] = fgetc(file); 
     j++; 
    } 
    j = 0; 
} 

Чтобы добавить в, если заявление, которое будет проверять, чтобы убедиться, что характер его читать в не символ новой строки \n. Готовый код будет выглядеть следующим образом:

for (int i = 0; i < 3; i++) 
{ 
    while (j<5) 
    { 
     char c = fegetc(file); 
     if(c != '\n') 
     { 
      grid[i][j] = fgetc(file); 
      j++; 
     } 
    } 
    j = 0; 
} 

пустячного Bits предположил, что внутренний контур будет изменен на цикл (для удобства чтения). Я бы согласился, однако у него есть недостаток в том, что нужно положить j-- в другую часть инструкции if, даже не требуя инструкции else. Вы можете просмотреть указанное исправление, и это исправление с внутренним циклом, измененным на цикл for, и решить, какой из них, по вашему мнению, имеет лучшую читаемость в этом случае. Этот код представляет это изменение, а также исправление для исходной проблемы:

for (int i = 0; i < 3; i++) 
{ 
    for(int j = 0; j < 5; j++) 
    { 
     char c = fegetc(file); 
     if(c != '\n') 
     { 
      grid[i][j] = fgetc(file); 
     } else { 
      j--; 
     } 
    } 
} 
+1

Использование цикла 'for' вместо цикла' while' также будет более чистым. –

+0

@FiddlingBits Я согласен. Я отредактирую код для его представления. Спасибо за совет. –

+0

Я изменил то, что вы упомянули, но не сработало – Nasser

0

Попробуйте добавить еще один файл fgetc (file); после j = 0; (Без каких-либо заданий). Он вытащит новый символ линии из вашего файла.

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