Как прочитать все символы из файла и сохранить его в 2d массиве без \ n? - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь прочитать файл и сохранить каждый его символ в 2d массиве (размером 7 на 7) без специальных символов, таких как '\ n', а затем распечатать этот 2d массив.

Я пишу код, но он не сохраняет и не печатает символы последней строки в массиве 2d.

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


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

         fscanf(fp,"%c",&ar[i][j]);
        }


    }


for(i=0; i<7; i++)
    {
        for(j=0; j<7; j++)
        {
            printf("%c",ar[i][j]);
        }

    }
fclose(fp);
}

Это вывод моего кода:

abtvelo
camerag
bhtollp
qeryvxq
appboyl
awerfgh

Но файл содержит,

abtvelo
camerag
bhtollp
qeryvxq
appboyl
awerfgh
comsats

Здесь файл также содержит слово «comsats», которое не печатается. Почему это слово comsats не печатается?

Ответы [ 2 ]

2 голосов
/ 31 мая 2019
    for(i=0; i<7; i++)
    {
        for(j=0; j<7; j++)
        {
            fscanf(fp,"%c",&ar[i][j]);
        }
    }

ar[i][0] будет иметь значение \n, исключенное из предыдущей строки, суммируя до 7 \n, таким образом, игнорируя последнюю строку.


изменить на

            fscanf(fp," %c",&ar[i][j]);

или

имеет getchar() после внутреннего цикла for.

1 голос
/ 31 мая 2019

Символ \n вызывает пропуск последней строки.
Изменить это:

     fscanf(fp,"%c",&ar[i][j]);

К этому:

     fscanf(fp," %c",&ar[i][j]);
                ^

Пробел занимает символ новой строки при использовании спецификаторов формата scanf(), таких как %c %lf %d и т. Д. Однако пробел не требуется для чтения строк (%s).

Относительно вашего утверждения: без специальных символов, таких как '\ n'
Если под этим вы ссылаетесь на такие символы, как:

  • пробел ("")
  • горизонтальная вкладка ("\ t")
  • formfeed ("\ f")
  • возврат каретки ("\ r")
  • вертикальная табуляция ("\ v")
  • и, конечно, перевод строки ("\ n")

Рассмотрите возможность замены конструкции fscanf () на конструкцию с использованием fgetc () в сочетании с функцией проверки пробелов: isspace () . (который проверяет перечисленные выше символы.) Пример:

#define ROW 7
#define COL 7
int main(void)
{
    int row = 0;
    int col = 0;
    char ar[COL][ROW];
    int byte;

    FILE *fp = fopen(filename, "r");
    if(fp)
    {
        byte = fgetc(fp);
        while(byte != EOF)
        {
            if(!isspace(byte))
            {   //populate array only if not white-space
                ar[col][row++] = (char)byte;
                if(row == ROW) 
                {
                    row = 0;
                    col++;
                }
                if(col == COL) break;
            }
            byte = fgetc(fp);
        }
        fclose(fp);
    }
    // print results as in your original post...    

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