Почему это c программирование дает результат в случае необходимости? - PullRequest
0 голосов
/ 02 июня 2019

Я создал файл B12, который содержит некоторые символы, я хочу сохранить этот файл в 2d массиве, а затем распечатать его, но мой код не дает правильного вывода.

Я пробовал использовать этот код, но он не смог мне помочь

     #include<stdio.h>
     #include<stdlib.h>
     int main()
     {
        char ar[9][9];
        int i,j;
        FILE *fp;
        fp=fopen("B12.txt","r");
        if(fp==NULL)
           printf("File not Found");

        for(i=0; i<9; i++)
     {
            for(j=0; j<9; j++)
           {

                 fscanf(fp," %c",&ar[i][j]);
           }
     }
        for(i=0; i<9; i++)
     {
            for(j=0; j<8; j++)
        {
                 printf("%c",ar[i][j]);
        }
            printf("\n");
      }



      return 0;
     }

Вывод кода выше:

applemas
obnanaoa
qamalikg
rlpoppqf
elpaaprv
langolne
oagtqamv
okgqplpm
cwfaalpa

Но файл содержит следующие символы, которые мне нужно напечатать,

applemasgo
bnanaoatqa 
malikgqrlp
oppqfaelpa
aprvelango
lnenoagtqa 
mvlokgqplp
mpcwfaalpa
ghbnnmlspq
oppomobile

1 Ответ

0 голосов
/ 02 июня 2019

Непонятно, что вы хотите, но если вы хотите читать, хранить и распечатывать файлы разного размера, можно использовать массив переменной длины.
Прочитайте файл, чтобы подсчитать количество строк и максимальное количество столбцов.
Объявите массив переменной длины. Инициализируйте массив, если есть строки с разными столбцами.
Перемотайте файл и сохраните символы в массиве.

#include <stdio.h>
#include <stdlib.h>

int main ( void) {
    int row = 0;
    int col = 0;
    int line = 0;
    int each = 0;
    int ch = 0;
    FILE *fp = NULL;;

    fp = fopen ( "B12.txt", "r");
    if ( fp == NULL) {
        fprintf ( stderr, "File not Found\n");
        return 0;
    }

    while ( EOF != ( ch = fgetc ( fp))) {//read a character into ch
        if ( '\n' == ch) {//found a newline
            row++;//count rows
            each = 0;
            continue;
        }
        each++;//count characters
        if ( each > col) {
            col = each;//store maximum col
        }
    }

    rewind ( fp);//go back to start of file

    char arr[row][col];//variable length array

    for ( line = 0; line < row; ++line) {
        for ( each = 0; each < col; ++each) {
            arr[line][each] = 0;//set all to 0
        }
    }

    line = 0;
    each = 0;

    while ( EOF != ( ch = fgetc ( fp))) {//read a character into ch
        if ( '\n' == ch) {//found a newline
            line++;//next line
            each = 0;//first character
            continue;//do not store the newline
        }
        arr[line][each] = ch;//save ch into arr
        each++;//next character
    }

    fclose ( fp);

    for ( line = 0; line < row; ++line) {
        for ( each = 0; each < col; ++each) {
            if ( arr[line][each]) {//not 0
                fputc ( arr[line][each], stdout);
            }
        }
        fputc ( '\n', stdout);
    }

    return 0;
}

Другой вариант - использовать malloc для выделения памяти, а не массива переменной длины. Это также позволит для чтения и распределения при чтении файла только один раз. Возможно, это позволит обрабатывать файлы большего размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...