C从具有科学记数法的文件读取输入到2d数组

时间:2016-10-30 12:53:34

标签: c arrays matrix

我将1列中的24个科学数字列表作为txt文件(使用%le格式)。

    #include <stdio.h>
    #include <stdlib.h>



    void main()
    {
      int i;
      int j;

    /*matrix*/

    double** mat=malloc(24*sizeof(double*)); 
    for(i=0;i<24;++i)
    mat[i]=malloc(1*sizeof(double));


        FILE *file;
        file=fopen("input.txt", "r");


        if ((file = fopen("input.txt", "r")) == NULL)
      {
         printf("Error! opening file");
         // Program exits if file pointer returns NULL.
        exit(1);         
      }

     else

   for(i = 0; i < 24; i++)
 {
  for(j = 0; j < 1; j++) 
  {

   if (!fscanf(file, "%le", &mat[i][j])) 
       break;

    printf("%le\n",mat[i][j]);
  } 


 }
  fclose(file);
 }

现在我想将这个包含24个元素的1d数组放入一个4乘6的矩阵A中。

我该怎么做?

我试过做=&gt;

  for(m=1;m<=4;m++)
  {
    for(n=1;n<=6;n++)
        {
            mat[k][1]=A[i][j];

            k++;
        }   

  }

        printf("%lf \n",A[i][j]);   

但这没有任何作用。我是C的新手,所以任何帮助都将非常感谢谢谢。

对于像我所知的矩阵中读取和写入这样的简单任务来说,程序太长了。

3 个答案:

答案 0 :(得分:0)

似乎你不会在你的循环中增加i,j索引,你应该把printf放在第二个循环中。

试试这个

k=0;
for(i=0;i<4;i++)
 for(j=0;j<6;j++)
 {
  A[i][j] = *(mat[k++]);
  printf("%f\n",A[i][j]);
 }

答案 1 :(得分:0)

for(m=1;m<=4;m++) //wrong counters
{
    for(n=1;n<=6;n++)
    {
        mat[k][1]=A[i][j]; //does not assign anything
        k++;
    }   
}
printf("%lf \n",A[i][j]); //not in loop

你应该从for循环中的0开始计数,因为数组是从0开始索引的。并确保使用正确的符号,并将k声明为int并初始化它,即int k = 0;。< / p>

您想要分配值的内容必须位于左侧,而分配的内容必须位于右侧。

最后,您的print语句不在循环中。

以下是一个例子:

for(int i = 0; i < 4; i++){
    for(int j = 0; j < 6; j++){
        A[i][j] = mat[k][0];
        k++;
        printf("%lf \n",A[i][j]);
    }
}

答案 2 :(得分:0)

for(m=1;m<=4;m++)
{
  for(n=1;n<=6;n++)
  {
    mat[k][1]=A[i][j];
    k++;
  }
}

您的循环索引为mn,但您使用ij作为下标 - ij永远不会在循环中初始化或更新。

更大的问题是,您要将A[i][j]的值分配给mat[k][1],而不是相反。

但这仍有问题 - 请记住,在C中,N元素数组的索引从0到N-1。如果A是一个4x6数组且mat是一个24x1数组(后面会有更多),那么应该编写你的循环

for ( m = 0; m < 4; m++ )
{
  for ( n = 0; n < 6; n++ )
  {
    A[m][n] = mat[k++][0];
  }
}

第一个元素位于索引0,第二个元素位于索引1,等等

关于mat ...

如果你知道它将存储24个值,那么为什么你需要动态分配mat并不清楚。它还不清楚为什么它需要是一个24x1阵列。只需将其声明为double的24元素数组:

double mat[24];
...
for ( i = 0; i < 24; i++ )
{
  if ( scanf( file, "%le", &mat[i] ) != 1 )
    // handle read error
}
...
for ( k = 0, i = 0; i < 4; i++ )
  for ( j = 0; j < 6; j++ )
    A[i][j] = mat[k++];

最后,void main()应为int main( void )