在C中将文件读入多维字符数组

时间:2017-01-02 17:40:18

标签: c file pointers multidimensional-array

我正在尝试从文件中读取多维字符串矩阵并将其存储到字符数组数组中,如下所示:

char *A[M][N];

如果我留在main函数中,这可以正常工作。 但是,当我试图通过引用调用函数时,它不起作用。

功能调用:

readMatrix(file,A);

功能标题:

int readMatrix(FILE *file,char *matrix[][]);

我也试过这个:

int readMatrix(FILE *file,char ***matrix);

这也行不通。 我想在函数中操作数组,因此我需要进行引用调用。

3 个答案:

答案 0 :(得分:1)

您必须将N作为矩阵类型的一部分传递给ReadMatrix函数,并且因为在编译时不知道它,所以您也必须将它们作为参数传递:

int readMatrix(FILE *file, size_t M, size_t N, char *matrix[][N]);

您确实可以将数组参数指定为char *matrix[M][N],但函数参数会忽略第一个维度大小M,因为它只接收指向数组的指针。

以下是一个例子:

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

int readMatrix(FILE *file, size_t rows, size_t cols, char *matrix[][cols]) {
    int rc = 0;
    for (size_t i = 0; i < rows; i++) {
        for (size_t j = 0; j < cols; j++) {
            char buf[80];
            if (rc == 0 && fscanf(file, "%79s", buf) == 1) {
                matrix[i][j] = strdup(buf);
            } else {
                matrix[i][j] = NULL;
                rc = -1;
            }
        }
    }
    return rc;
}

int main(void) {
    size_t rows, cols;
    if (scanf("%zu %zu", &rows, &cols) != 2)
        return 1;
    char *mat[rows][cols];
    if (readMatrix(stdin, rows, cols, mat) == 0) {
        for (size_t i = 0; i < rows; i++) {
            for (size_t j = 0; j < cols; j++) {
                printf(" %8s", mat[i][j]);
            }
            printf("\n");
        }
    }
    for (size_t i = 0; i < rows; i++) {
        for (size_t j = 0; j < cols; j++) {
            free(mat[i][j]);
        }
    }
    return 0;
}

答案 1 :(得分:0)

在函数readMatrix中你还需要传递M和N的值,否则它不能知道每个A [i]的确切位置,所以你不知道每一行的加载位置。

答案 2 :(得分:-1)

您可以使用此方法来实现:

#include <stdio.h>
#define MAX_WORD_SIZE 10
void readMatrix(FILE*,char****);
int main(void){
    FILE* cin = fopen("input.txt","r");
    char*** inputMatrix;
    readMatrix(cin,&inputMatrix);
    for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                printf("%s ",*(*(inputMatrix+i)+j));
            }
            printf("\n");
    }
    fclose(cin);
    return 0;
}
void readMatrix(FILE* cin,char**** matrix){
    int rowNum,columnNum;
    char buff[10];
    int intBuff;
    fscanf(cin,"%d",&intBuff);
    rowNum = intBuff;
    fscanf(cin,"%d",&intBuff);
    columnNum = intBuff;
    *matrix = malloc(rowNum*sizeof(char**));
    for(int i=0;i<rowNum;i++){
        *(*matrix+i) = malloc(columnNum*sizeof(char*));
    }

    for(int i=0;i<rowNum;i++){
        for(int j=0;j<columnNum;j++){
            *(*(*matrix+i)+j) = malloc(MAX_WORD_SIZE*sizeof(char));
            fscanf(cin,"%s",*(*(*matrix+i)+j));
        }
    }
}

使用此输入文件(input.txt文件位于同一文件夹中),此代码在Linux GCC上运行良好

3 3
ab cd ef
gh ij kl
mn op qr

在input.txt文件的第一行,第一个整数表示行号,第二个整数表示列号。