逐行读取文件内容到矩阵

时间:2018-12-19 01:02:16

标签: c fopen

我试图编写一个可以将文本文件内容逐行复制到矩阵的函数,所以这就是我想出的:

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

我试图在Windows和Linux上编译并运行它,但是它唯一要做的就是给我几乎没有用的错误,例如:

"Segmentation fault (core dumped)"

requests

3 个答案:

答案 0 :(得分:0)

您必须为none的每个元素分配内存。这与写作完全相同:

matrix

作为程序的第一步,遍历char *s = "string"; ,并为每个单元格调用matrix

malloc

注意:我们检查int i; for (i = 0; i < 5; ++i) if (!(matrix[i] = malloc(MAXLEN))) [ perror("malloc"); exit(EXIT_FAILURE); } 的返回值以确保没有发生错误。

答案 1 :(得分:0)

使用您的代码,我认为文件中的矩阵将受到限制(您定义的行数为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)

答案 2 :(得分:0)

谢谢您的答复,我认为您的解决方案非常聪明,但我一直在寻找更简单的解决方案。

经过一番尝试和错误后,我认为我找到了一个解决方案,该解决方案不是很通用,但它很简单,而且似乎可以正常工作:

#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]);
    }
}

再次感谢您的回答