Странный цикл при чтении из файла в C - PullRequest
0 голосов
/ 14 ноября 2018

Я пишу код на C, чтобы прочитать матрицы (квадратная матрица с 3 <= dim <= 9) из файла .txt и распечатать его точно так, как написано. Файл организован следующим образом: </p>

5
AAAAA
AAAAA
AAAAA
AAAAA
AAAAA
6
XXXXXX
XXXXXX
XXXXXX
XXXXXX
XXXXXX
XXXXXX

Первое число указывает размер последующей матрицы.

Я написал следующий код:

int main () {
    FILE *arquivo;
    char A[9][9];
    int N;
    int i,j;
    char temp;
    arquivo = fopen("matrizes.txt", "r");
    if (!arquivo) printf("Erro.\n");
    while (fscanf(arquivo, "%d", &N) != EOF) {   
        printf("%d \n", N);
        fgetc(arquivo);
        for (i = 0; ((i < N) && (temp = fgetc(arquivo)) != '\n') ; i++) {
            for (j = 0; j < N; j++) {
                A[i][j] = temp;
            }
        }
        for (i = 0; i < N; i++) {
            for(j = 0; j<N; j++) {
                printf("%c", A[i][j]);
            }
            puts(" ");
        }
    }
    return 0;
}

Вывод это

5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 

Честно говоря, я понятия не имею, почему это происходит. Я пробовал разные условия, чтобы остановить цикл, но ни один из них не сработал.

Если я изменюсь

while (fscanf (arquivo, "% d", & N)! = EOF)

в

while (fscanf (arquivo, "% d", & N) == 1)

вывод просто

5
AAAAA
AAAAA
AAAAA
AAAAA
AAAAA

Значение второго цикла scanf в этом случае равно «0». Как я могу это исправить и напечатать именно то, что написано в файле?

Кстати, я знаю, что есть другие формы для печати .txt точно, как это сделано, я имею в виду, мне не нужны двухмерные массивы, чтобы сделать это. Тем не менее, я буду использовать эту программу для чтения нескольких матриц и выполнения некоторых тестов с ними (также я хочу также распечатать их), поэтому мне действительно нужно хранить данные в матрице символов.

1 Ответ

0 голосов
/ 14 ноября 2018

Проблема здесь.

   for (i = 0; ((i < N) && (temp = fgetc(arquivo)) != '\n') ; i++) {
        for (j = 0; j < N; j++) {
            A[i][j] = temp;
        }
    }

Цикл завершится, как только увидит новую строку, и снова начнет цикл while.

Вместо этого вы хотите прочитать N строк.

    for (i = 0; i < N; i++) {
        for(j = 0; (temp = fgetc(arquivo)) != '\n'; j++ ) {
            A[i][j] = temp;
        }
    }
...