读取包含二维矩阵的 .txt 文件,fscanf 仅从 .txt 文件中获取第一个数据元素
Posted
技术标签:
【中文标题】读取包含二维矩阵的 .txt 文件,fscanf 仅从 .txt 文件中获取第一个数据元素【英文标题】:Reading a .txt file containing a 2D matrix, fscanf only grabbing first data element from .txt file 【发布时间】: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
失败。
【参考方案1】:
populateMatrixFromFile
中的代码在循环中调用rowCounter()
和colCounter()
函数。这不仅会浪费大量时间,而且还会在循环的每次迭代中rewinds
文件。最好在main
中准确一次 调用rowCounter()
和colCounter()
,然后将计数传递给其他函数。
【讨论】:
所以我更新了我的代码以在 main 中调用rowCounter()
和 colCounter()
并将它们的值传递给我的函数,这给了我预期的输出。所以由于我在这些函数中倒带,当我调用fscanf
时,它会再次出现在文件的开头?
感谢您的帮助!我在 OP 中添加了一个编辑,其中包含您帮助找到的问题描述和解决方案。【参考方案2】:
所以问题在于您的 rowCounter 和 colCounter。更具体地说,您在 for 循环中调用它们,因为您不断倒带,然后当然您只能打印“1”。 尝试将 rowCount 和 colCount 作为参数传递给 populateMatrixFromFile 和 matrixPrinter。
【讨论】:
@Figura,也感谢您的帮助!我在 OP 中添加了一个编辑,其中包含您帮助找到的问题描述和解决方案。以上是关于读取包含二维矩阵的 .txt 文件,fscanf 仅从 .txt 文件中获取第一个数据元素的主要内容,如果未能解决你的问题,请参考以下文章