【问题标题】:C reading input from a file with scientific notation into 2d arrayC从带有科学计数法的文件中读取输入到二维数组中
【发布时间】:2016-10-30 12:53:34
【问题描述】:

我在 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 个元素组成的一维数组放入一个 4 x 6 矩阵 A。

我该怎么做?

我试过了=>

  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 新手,因此非常感谢您的帮助。

对于像在我知道的矩阵中读写这样的简单任务来说,程序太长了..

【问题讨论】:

    标签: c arrays matrix


    【解决方案1】:
    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...

    如果您知道 mat 将存储 24 个值,则不清楚为什么需要动态分配它。也不清楚为什么它需要是一个 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 )

    【讨论】:

      【解决方案2】:

      看来您没有增加循环中的 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]);
       }
      

      【讨论】:

        【解决方案3】:
        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;

        你要赋值的东西必须在左边,被赋值的东西必须在右边。

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

        这是一个例子:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          • 2016-01-05
          • 1970-01-01
          • 2017-08-23
          相关资源
          最近更新 更多