首页 > 解决方案 > 在文件中逐行存储一个巨大的数组会导致文件损坏

问题描述

我有一个输入数组 A 存储在内存中,用于生成另一个数组,更大的 B。但是,由于 B 是一个巨大的数组,我并不想将它存储在内存中,而是将其保存在本地到文件中(使用fwrite)。为此,我计算i第 th行的每次迭代并将其附加到输出文件中。这样,我一次只需要在内存中存储一​​行,最终创建一个输出文件,其中包含我需要的所有数据。

考虑到它包含的项目数量,输出文件的大小似乎合适。然而,当我尝试使用fread,(例如,检索前 2000 个项目)从输出文件中读回片段时,只检索到前 23 个项目。

这是创建输出文件的主要功能:

void exportCovMatrix(char *outputString, double *inputStdMatrix, int colDim, int rowDim) {
    double *covRow = calloc(rowDim, sizeof(double));
    int i, j, n;
    FILE *output;
    fclose(fopen(outputString, "w"));
    output = fopen(outputString, "a");
    assert(covRow != NULL);
    assert(output != NULL);
    for (i = 0; i < rowDim; i++) {
        for (j = 0; j < rowDim; j++)
            covRow[j] = dotProduct(&inputStdMatrix[i * colDim], &inputStdMatrix[j * colDim], colDim);
        n = fwrite(covRow, sizeof(double), rowDim, output);
        assert(n == rowDim);
    }
    fclose(output);
    free(covRow);
}

这是另一个函数,它读取给定的输出文件:

double *calculateNextB(char* inputString, double* row, int dim){
    FILE* input = fopen(inputString, "r");
    int i, j;
    assert(input != NULL);
    for(i = 0; i <= dim; i++){
        j = fread(row, sizeof(double), dim, input);
        printf("%d items were read.\n", j);
    }
    ...
}

我将不胜感激在解决此问题方面的任何帮助。谢谢!

标签: carraysfilefwritefread

解决方案


您分别打开文件

fclose(fopen(outputString, "w"));

FILE* input = fopen(inputString, "r");

但正如这里所解释的那样

为了将文件作为二进制文件打开,“b”字符必须包含在模式字符串中。

(我知道它是 C++ 源代码,但在某些系统中确实如此,尽管它不在许多 POSIX 系统中,如https://linux.die.net/man/3/fopen中所述)


推荐阅读