【发布时间】:2018-08-21 03:54:50
【问题描述】:
我正在尝试将 .txt 文件中的 2D 矩阵读取到动态大小的 2D 数组中。 .txt 文件中的矩阵是制表符分隔的,可以是任何大小,但为简单起见,我们有:
1 2 3
4 5 6
7 8 9
我解析文件的行数和列数,使用malloc() 动态创建一个空的二维数组**dynamicMatrix,并尝试用我的文件中的数据填充所述数组。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
/* File Names for IO */
#define MATRIX2 "matrix2.txt"
int rowCounter(FILE *filePtr)
{
int rowCount = 1;
int ch;
while ((ch = fgetc(filePtr)) != EOF)
{
if (ch == '\n')
{
rowCount++;
}
}
rewind(filePtr);
//printf("row count:%d\n", rowCount);
return rowCount;
}
int colCounter(FILE *filePtr)
{
int colCount = 1;
int ch;
while ((ch = fgetc(filePtr)) != '\n')
{
//printf("ch was: %c\n", ch);
if (ch == '\t')
{
colCount++;
}
}
rewind(filePtr);
//printf("col count:%d\n", colCount);
return colCount;
}
int **matrixConstructor(FILE *filePtr)
{
int rowCount = rowCounter(filePtr);
int colCount = colCounter(filePtr);
int **dynamicMatrix;
dynamicMatrix = malloc(rowCount * sizeof(int*));
for (int i = 0; i < rowCount; i++)
{
dynamicMatrix[i] = malloc(colCount * sizeof(int));
}
return dynamicMatrix;
}
void populateMatrixFromFile(FILE *filePtr, int **dynamicMatrix)
{
for (int i = 0; i < rowCounter(filePtr); i++)
{
for (int j = 0; j < colCounter(filePtr); j++)
{
fscanf(filePtr, "%d", &dynamicMatrix[i][j]);
}
}
}
void matrixPrinter(FILE *filePtr, int **dynamicMatrix)
{
for (int j = 0; j<colCounter(filePtr); j++)
{
for (int i = 0; i<rowCounter(filePtr); i++)
{
printf("%d\t", dynamicMatrix[j][i]);
}
printf("\n");
}
}
int main()
{
/* File Pointers and Open Files to Read */
FILE *fpMatrixIN2 = fopen(MATRIX2, "r");
/* Check File Pointers for Null, Exit if Null */
if (fpMatrixIN2 == NULL)
{
printf("One or more files failed to be found. Please make sure they are in the same directory as the executable.\n");
system("pause");
exit(1); //shut down program to avoid crash
}
/* Empty Arrays of Appropriate Lengths to store Matrices from Files */
int **dynamicMatrix2 = matrixConstructor(fpMatrixIN2);
populateMatrixFromFile(fpMatrixIN2, dynamicMatrix2);
matrixPrinter(fpMatrixIN2, dynamicMatrix2);
//system("pause");
return 0;
}
我遇到的问题是fscanf(filePtr, "%d", &dynamicMatrix[i][j]) 似乎只是从我的文件中读取第一个 int,所以我的 3x3 dynamicMatrix 填充了 1。我不确定为什么会发生这种情况,因为我的理解是 fscanf() 应该将 int 读入数组,然后继续读取第二个、第三个等等。
打印**dynamicMatrix的预期输出:
1 2 3
4 5 6
7 8 9
打印**dynamicMatrix的实际输出:
1 1 1
1 1 1
1 1 1
我一直在努力解决这个问题,因此非常感谢您多一双眼睛来帮助发现问题:)
编辑
正如@user3386109 和@f igura 提到的那样,问题是我在populateMatrixFromFile 的for 循环中调用了rowCounter() 和colCounter(),它在循环的每次迭代中不断倒回文件指针,从而导致fscanf()每次只读1。我将代码更改为在 main 中调用 rowCounter() 和 colCounter(),然后将它们的值传递给我的函数。
【问题讨论】:
-
检查
fscanf的返回值,如果不是1,则fscanf失败。