【问题标题】:Reading txt file with floats into a 2-D Matrix将带有浮点数的 txt 文件读入二维矩阵
【发布时间】:2014-02-23 02:53:14
【问题描述】:

我正在尝试读取包含内容的“chol.txt”文件:

6 3 4 8
3 6 5 1
4 5 10 7
8 1 7 25

使用函数:(其中 *ROW 和 *COL 的值都为 4)

void ReadFile(float*** MATRIX, int* ROW, int* COL)
{
FILE* openF;

openF = fopen("chol.txt", "r");

for (int incROW = 0; incROW < *ROW; incROW++)
{
    for (int incCOL = 0; incCOL < *COL; incCOL++)
    {
        fscanf(openF, "%f", MATRIX[incROW][incCOL]);
        printf("MATRIX[%d][%d] has value %f\n", incROW, incCOL, (*MATRIX)[incROW][incCOL]);
    }
}

fclose(openF);
}

但它会在崩溃前返回文本:

MATRIX[0][0] has value 6.000000
MATRIX[0][1] has value 0.000000
MATRIX[0][2] has value 4413697645709019316224.000000
MATRIX[0][3] has value 17751098170076127766626959360.000000

我可以手动将浮点数输入矩阵,但现在想从 txt 文件中读取。这是我的 main() 的摘要:

void ReadFile(float*** MATRIX, int* ROW, int* COL);

int main()
{
int SIZE = 4;
float** M = NULL;

MakeNullMATRIX(&M, &SIZE, &SIZE);

ReadFile(&M, &SIZE, &SIZE);

return 0;
}

根据要求 MakeNullMATRIX:

void MakeNullMATRIX(float*** MATRIX, int* ROW, int* COL)
{
*MATRIX = (float **)malloc(*ROW * sizeof(float*));

for (int i = 0; i < *ROW; i++)
{
    (*MATRIX)[i] = (float *)malloc(*COL * sizeof(float));
}
}

【问题讨论】:

  • 您的问题标题说这是一个 2x2 矩阵,但您的示例数据表明这是一个 4x4 矩阵,这只是稍微令人担忧。你正在传递一个指针到指针到指针到浮点的更是如此。发布您的 main() 来调用它。
  • 还有MakeNullMATRIX()
  • 我找到了解决方案'fscanf(openF, "%f", **&(*MATRIX)**[incROW][incCOL]);'

标签: c loops pointers matrix floating-point


【解决方案1】:

好吧,抱歉,但这看起来太复杂了……

无论如何,无需提供太多更改;虽然您需要将M 的地址传递给MakeNullMATRIX,但对于ReadFile,您不必这样做。所以……

1:改变这一行:

ReadFile(&M, &SIZE, &SIZE);

像这样:

ReadFile(M, ... );  // removed &

2:然后这一行:

void ReadFile(float*** MATRIX, int* ROW, int* COL);

进入这个:

void ReadFile(float ** MATRIX, ... );  // removed one *

3:然后这些行:

fscanf(openF, "%f", MATRIX[incROW][incCOL]);
...
printf("MATRIX[%d][%d] has value %f\n", incROW, incCOL, (*MATRIX)[incROW][incCOL]);

进入这些:

fscanf( ... , &( MATRIX[incROW][incCOL]) );  // enclosed it with &( )
...
printf( ... , MATRIX[incROW][incCOL] );  // removed (* )

应该让它按你的意愿工作,同时让你的代码对随机读者更友好。

但我真的无法理解为什么不这样简单:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>

void ReadFile( float * MATRIX, int * ROW, int * COL )
{
    FILE * openF = fopen( "chol.txt", "r" );

    if ( !openF ) {
        fprintf( stderr, "chol.txt is missing\n" );
        return;
    }

    for ( int incROW = 0; incROW < *ROW; incROW++ )
    {
        for ( int incCOL = 0; incCOL < *COL; incCOL++ )
        {
            fscanf( openF, "%f", MATRIX + (*ROW) * incROW + incCOL );
            printf( "MATRIX[%d][%d] has value %f\n", incROW, incCOL, *( MATRIX + (*ROW) * incROW + incCOL ) );
        }
    }

    fclose( openF );
}

int main( )
{
    int SIZE = 4;
    float * M = malloc( SIZE * SIZE * sizeof( *M ) );

    ReadFile( M, &SIZE, &SIZE );

    return 0;
}

【讨论】:

  • 我一次处理几个矩阵,所以我尽量让它模块化和一致。此外,我将对较大的矩阵进行数值分解。我有一种非常强烈的感觉,问题出在 ReadFile(...) 函数而不是 main() 或 MakeNullMATRIX(...) 这就是为什么我在被要求之前才将它们包括在内的原因;而我所做的只是准系统。
【解决方案2】:

fscanf() 的调用应该是这样的

fscanf(openF, " %f", &((*MATRIX)[incROW][incCOL]));

【讨论】:

  • 谢谢。对我来说这似乎是多余的,但我最终认为值得一试,并且成功了!
  • @user3339814 MATRIX[incROW][incCOL] 表示您尝试将MATRIX 用作二维数组,但在您的情况下,MATRIX 实际上是指向二维数组的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2014-04-06
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多