读取包含2D矩阵的.txt文件,fscanf只从.txt文件中获取第一个数据元素

时间:2018-03-13 01:27:55

标签: c pointers file-io

我正在尝试将.txt文件中的2D矩阵读入动态大小的2D数组中。 .txt文件中的矩阵以制表符分隔,可以是任何大小,但为简单起见,我们有:

1 2 3  
4 5 6  
7 8 9

我解析文件的行数和列数,使用**dynamicMatrix动态创建一个空的2D数组malloc()并尝试用我文件中的数据填充所述数组。 这是我的代码:

#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一样,问题是我在rowCounter()的for循环中调用了colCounter()populateMatrixFromFile,它在每次迭代时都会重绕文件指针循环,因此导致fscanf()每次只读1。我更改了代码以在main中调用rowCounter()colCounter(),然后将其值传递给我的函数。

2 个答案:

答案 0 :(得分:1)

所以问题是你的rowCounter和colCounter。更具体地说,你在for循环中调用它们导致你继续倒带,当然你只能打印&#34; 1&#34;。 尝试将rowCount和colCount作为参数传递给populateMatrixFromFile和matrixPrinter。

答案 1 :(得分:0)

rowCounter()中的代码调用循环中的colCounter()rewinds函数。这不仅浪费了大量时间,而且在循环的每次迭代中它也rowCounter()。最好在colCounter()中致电main[] :: [a] (:) :: a -> [a] -> [a] 完全 一次 ,然后将计数传递给其他功能