读取包含二维矩阵的 .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", &amp;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 文件中获取第一个数据元素的主要内容,如果未能解决你的问题,请参考以下文章

C语言中fscanf()按一定的格式读取文本文件!

从 .txt 文件中读取未知大小的整数二维数组的最有效方法是啥?

fscanf()函数。使用C中的模式读取文件

java读取txt时数据缺失的处理

从标准输入读取和打印矩阵

C中的fscanf - 如何确定逗号?