Чтение содержимого файла построчно в матрицу - PullRequest
0 голосов
/ 19 декабря 2018

Я пытался написать функцию, которая могла бы построчно копировать содержимое текстового файла в матрицу, поэтому я пришел к следующему:

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

#define rows 5
#define columns 12

void file_to_matrix(char *matrix[]){
    FILE *file = fopen("swamp.txt", "r");

    if(file==NULL){
        printf("File error");
        exit(1);
    }

    int y=0;

    for(int x=0; (matrix[y][x]=fgetc(file))!=EOF; ++x){
        if(matrix[y][x]=='\n'){
            ++y;
            x=0;
        }
    }

    fclose(file);
}

int main(){
    char *matrix[rows];

    file_to_matrix(matrix);

    for(int i=0; i<5; ++i){
        for(int j = 0; j < 11; j++){
            printf("%c", matrix[i][j]);
        }
        printf("\n");
    }
}

Я попытался скомпилировать и запустить его наWindows и Linux, но единственное, что ему удается, это выдавать мне ошибки, которые практически бесполезны, например:

"Stopping due to fatal error: NullReferenceException: Object reference not set to an instance of an object"

или

"Segmentation fault (core dumped)"

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

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

#include <stdio.h>
#include <stdlib.h> //malloc realloc

//file read function. returning string with splitted new line
//ex: (note: newline is '\n' (ENTER))
//test.txt:
//10 20 30(space)(newline)
//40 50 60(space)(newline)

void file_to_matrix(char *filename)
{
    FILE * file = fopen(filename, "r");
    char *buff = (char*)malloc(sizeof(char)); //temp string
    int *matrix_row = (int*)malloc(sizeof(int)); //temp matrix row
    int **MATRIX = (int**)malloc(sizeof(int*)); //this will become the final matrix
    int index_buff = 0, index_MATRIX = 0, index_matrix_row = 0; 
    while (1)
    {
        char c = getc(file);
        if (c==EOF)
        {
            break;
        }
        if (c=='\n') //if c meet newline, then add the matrix row to final matrix 
        {
            (*(MATRIX+index_MATRIX)) = matrix_row;
            index_MATRIX++;
            MATRIX = realloc(MATRIX, sizeof(MATRIX)*(index_MATRIX+1));
            matrix_row = (int*)malloc(sizeof(int));
            index_matrix_row = 0;
            printf("\n");
            continue;
        }
        if (c==' ') //if c meet space, then buff wil converted to int
        {
            int num = atoi(buff);
            printf("%d ", num);
            (*(matrix_row+index_matrix_row)) = num;
            index_matrix_row++;
            matrix_row = realloc(matrix_row, sizeof(int)*(index_matrix_row+1));
            free(buff);
            buff = (char*)malloc(sizeof(char));
            index_buff=0;
            continue;
        }

        //add buff with c
        (*(buff+index_buff))=c;
        index_buff++;
        buff = realloc(buff, sizeof(char)*(index_buff+1));
    }
    fclose(file);


    //clearing the dynamic memory
    free(buff);
    for (int i = 0; i < index_MATRIX; i++)
    {
        free(MATRIX[i]);
    }
}

int main()
{
    file_to_matrix("test.txt");
    return 0;
}

test.txt:

10 20 30 
40 50 60 
70 80 90 

если вы перепутали с форматом test.txt, я объясню еще раз:

10 20 30(space)(newline)
30 40 60(space)(newline)
70 80 90(space)(newline)
0 голосов
/ 20 декабря 2018

Спасибо за ваши ответы, я думаю, что ваши решения очень умные, но я искал более простое.

После небольшого проб и ошибок я думаю, что нашел решение, которое неочень обобщенно, но это просто и, кажется, работает нормально:

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

#define ROWS <n of rows>
#define COLS <n of columns>

void file_to_matrix(int rows, int cols, char matrix[rows][cols], char file_path[]){
    FILE *file = fopen(file_path, "r");
    if(file==NULL){
        printf("File error");
        exit(1);
    }
    int y=0;
    for(int x=0; (matrix[y][x]=getc(file))!=EOF; ++x){
        if(matrix[y][x]=='\n'){
            matrix[y][x]='\0';
            ++y;
            x=-1;
        }
    }
        fclose(file);
    }

int main(){
    char matrix[ROWS][COLS+2];
    file_to_matrix(ROWS, COLS+2, matrix, "file path");
    for(int i=0; i<=ROWS; ++i){
        printf("%s\n", matrix[i]);
    }
}

Еще раз спасибо за ваши ответы

0 голосов
/ 19 декабря 2018

Вы должны выделить память для каждого элемента matrix.Это та же самая ошибка, что и при записи:

char *s = "string";

В качестве первого действия программы выполните цикл matrix и вызовите malloc для каждой ячейки:

int i;
for (i = 0; i < 5; ++i)
    if (!(matrix[i] = malloc(MAXLEN))) [
        perror("malloc");
        exit(EXIT_FAILURE);
    }

Примечание. Мы проверяем возвращаемое значение malloc, чтобы убедиться в отсутствии ошибок.

...