首先要说的是我对编码很新,所以请原谅我的错误。 我现在正试图从一个相当大的txt文件中读取它,它有大约1000000行和4个cols
56.154 59.365 98.3333 20.11125
98.54 69.3645 52.3333 69.876
76.154 29.365 34.3333 75.114
37.154 57.365 7.0 24.768
........
........
我想全部阅读它们并将它们存储到矩阵中,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main()
{
int i;
int j;
/*matrix*/
int** mat=malloc(1000000*sizeof(int));
for(i=0;i<1000000;++i)
mat[i]=malloc(4*sizeof(int));
FILE *file;
file=fopen("12345.txt", "r");
for(i = 0; i < 1000; i++)
{
for(j = 0; j < 4; j++)
{
if (!fscanf(file, " %c", &mat[i][j]))
break;
mat[i][j] -= '0'; /* I found it from internet but it doesn't work*/
printf("\n",mat[i][j]);
}
}
fclose(file);
}
结果是我的矩阵中什么都没有。我希望你能帮忙。提前感谢您的帮助。
答案 0 :(得分:5)
许多问题,请考虑以下,当然还要看评论
int main()
{
int i;
int j;
/*matrix*/
/*Use double , you have floating numbers not int*/
double** mat=malloc(1000000*sizeof(double*));
for(i=0;i<1000000;++i)
mat[i]=malloc(4*sizeof(double));
FILE *file;
file=fopen("1234.txt", "r");
for(i = 0; i < 1000; i++)
{
for(j = 0; j < 4; j++)
{
//Use lf format specifier, %c is for character
if (!fscanf(file, "%lf", &mat[i][j]))
break;
// mat[i][j] -= '0';
printf("%lf\n",mat[i][j]); //Use lf format specifier, \n is for new line
}
}
fclose(file);
}
答案 1 :(得分:0)
您的代码存在一些问题。
首先你创建一个int
的矩阵,但你正在读它看起来像浮点值。您可能想要使用double
其次,当你正在阅读双人时,你应该使用
fscanf(file, "%lf", &some_double); // fscanf(file, "%d", &some_int); for integers
另外,当您分配矩阵时,您应该传递第一个malloc
sizeof(double *) // or int * if you are really trying to use integers
最后你的行:
mat[i][j] -= '0'
你想在这里完成什么?你正在接受你(尝试)读入的int并减去'0'......
编辑我还注意到您正在编码正在阅读的行数,除非您知道文件的格式,否则我不会这样做。
答案 2 :(得分:0)
fscanf( "%c", ... )
仅扫描一个字符(例如“5”)。通过减去'0',您可以从字符5
中获得整数值'5'
。您可以使用"%d"
扫描仅由数字组成的整数(不包括格式字符),或"%f"
用于浮点数(不确定56.154
是否应被读为“56,000 154” (欧洲大陆)或“56 plus 154/1000”(GB / USA)(世界其他地区:不要被冒犯我只是不知道)
printf( "\n", ... )
:您忘记使用任何格式字符串,例如%d
(int),%f
(浮点)...所以您的参数不会被打印,只是换行本身。
int** mat=malloc(1000000*sizeof(int));
您在这里分配了一个int *
数组,因此它应该是int** mat=malloc(1000000*sizeof(int *));
编辑:我再次查看了您的文本文件,并看到了像98.54这样无法格式化整数的数字。所以很明显,如果您的数组为float
,则需要double
或int
,"%f"
使用float
或"%lf"
使用double
在fscanf()
和printf()