我正在尝试阅读包含内容的“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));
}
}
答案 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]));