将具有浮点的文本文件读入2D矩阵

时间:2014-02-23 02:53:14

标签: c loops pointers matrix floating-point

我正在尝试阅读包含内容的“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

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

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));
}
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

fscanf()的调用应该是

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