5

首先要说的是我对编码完全陌生,所以请原谅我的错误。我现在正在尝试从一个相当大的 txt 文件中读取,它有大约 1000000 行和 4 列

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

结果是我的矩阵中什么也没有。我希望你能帮忙。提前感谢您的帮助。


4

3 回答 3

7

许多问题,请考虑关注,当然也可以查看评论

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);
}
于 2013-08-13T17:39:21.050 回答
1
  1. fscanf( "%c", ... )只扫描一个字符(例如'5')。5通过减去“0”,您可以从字符中获得整数值'5'。您可以使用"%d"扫描仅由数字组成的整数(不包括格式字符)或"%f"浮点数(不确定56.154是读作“56,000 154”(欧洲大陆)还是“56 加 154/1000”(GB /美国)(世界其他地方:不要被冒犯我只是不知道)

  2. printf( "\n", ... ):您忘记使用任何格式字符串,例如%d(int), %f(float) ... 所以您的参数不会被打印,只会打印换行符本身。

  3. int** mat=malloc(1000000*sizeof(int));你在int *这里分配一个数组,所以它应该是int** mat=malloc(1000000*sizeof(int *));

编辑:我再次查看了您的文本文件,并看到了像 98.54 这样不能格式化整数的数字。因此,很明显,您将需要floatordouble代替,如果int用于您的数组并在两者中使用"%f"forfloat"%lf"for并且doublefscanf()printf()

于 2013-08-13T17:42:39.743 回答
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”...

编辑 我还注意到您正在对正在阅读的行数进行硬编码,除非您知道文件的格式,否则我不会这样做。

于 2013-08-13T17:32:22.167 回答