c - 在文件中逐行存储一个巨大的数组会导致文件损坏
问题描述
我有一个输入数组 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);
}
...
}
我将不胜感激在解决此问题方面的任何帮助。谢谢!
解决方案
您分别打开文件
fclose(fopen(outputString, "w"));
和
FILE* input = fopen(inputString, "r");
但正如这里所解释的那样
为了将文件作为二进制文件打开,“b”字符必须包含在模式字符串中。
(我知道它是 C++ 源代码,但在某些系统中确实如此,尽管它不在许多 POSIX 系统中,如https://linux.die.net/man/3/fopen中所述)
推荐阅读
- docker - 在 Traefik 动态配置中使用环境变量
- java - 我们可以在@Entity 类中创建@CollectionTable,哪个类在其他@Entity 类中用作CollectionTable
- mongodb - MongoDB,如何关联数组字段进行统计
- bash - 在 linux 文件中逐行比较
- javascript - 无法选择动态生成的 HTML 元素(使用 Handlebars Block 助手生成)
- python - 根据两列中的值匹配熊猫数据框中的行
- python - 使用 Google Vision API 从图像中提取分块文本
- php - 如何从数据库所有表中删除所有记录
- c++ - 代码块 16 位消息
- javascript - 我在函数之外提到的变量“x”我猜有一些问题。函数没有访问变量不知道为什么