读取文件并传递到大型多维数组时遇到问题

时间:2019-07-02 11:03:21

标签: c

我正在尝试读取大数据文件,并将数据作为9维数组 B[37][24][5][5][8][19][6][19][14]传递。稍后我将在代码中使用此数组。但是我得到了Segmentation fault error

我还尝试将B定义为指针,而不是数组,并使用命令“ B = (double *)malloc(5385542400 * sizeof(double));”。但这没有帮助。

这是我将B定义为数组的代码。

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <math.h>
#include <string.h>



/* If filename given, write to file; for empty filename write to 
screen */
char MYFILE[]="chisq_NHtest_NOvA_nu_app_non-uni_alpha_phi10_10sys.dat";
int main()
{
FILE *outfile = NULL; 

  outfile = fopen(MYFILE, "w");
  if (outfile == NULL)
  {
printf("Error opening output file.\n");
return -1;
  }

char MYFILE1[]="nova_app_nu_data.dat";

FILE *file1 = NULL;
file1 = fopen(MYFILE1, "r");
  if (file1 == NULL)
  {
    printf("Error reading input file1.\n");
    return -1;
  }
int i;
static double A[6];
double ret1;
 for (i=0; i<6; i++)
            {

             ret1= fscanf(file1,"%lf ",&A[i]);

    if (ret1 == EOF)
    {
    break;
    }
}


char MYFILE2[]="events_vs_E+test_NH_NOvA_nu_app_non-uni_phi10_alpha00_alpha10_alpha11.dat";

FILE *file2 = NULL;
file2 = fopen(MYFILE2, "r");
  if (file2 == NULL)
  {
    printf("Error reading input file2.\n");
    return -1;
  }
int k,l,m,n,o,p,q,r,s;
double C;
static double B[37][24][5][5][8][19][6][19][14];

double ret2;
 for (k=0; k<37; k++)
            {
 for (l=0; l<24; l++)
        {
for (m=0;m<5;m++)
         {
for (n=0;n<5;n++)
         {
for (p=0; p<8; p++)
        {
for (q=0; q<19; q++)
        {
for (r=0; r<6; r++)
        {
for (s=0; s<19; s++)
        {
for (o=0;o<14;o++)
{
          fscanf(file2,"%lf ",&ret2);
B[k][l][m][n][p][q][r][s][o]=ret2;
if (ret2 == EOF)
{
break;
}
}
}
}
}
}
}
}
}
}

exit(0);
}    

如果我将s循环的结束值从19更改为5,则代码运行正常。

1 个答案:

答案 0 :(得分:-1)

您编写的break语句将仅退出最里面的for循环。

要退出其他循环,您需要编写条件来检查是否已触发中断。但是,由于您有9个嵌套的for循环,因此最好使用goto语句。

double ret2;
int ret3;
for (k=0; k<37; k++)
{
  for (l=0; l<24; l++)
  {
    for (m=0;m<5;m++)
    { 
      for (n=0;n<5;n++)
      {
        for (p=0; p<8; p++)
        {
          for (q=0; q<19; q++)
          {
            for (r=0; r<6; r++)
            {
              for (s=0; s<19; s++)
              {
                for (o=0;o<14;o++)
                {
                   ret3 = fscanf(file2,"%lf ",&ret2);
                   B[k][l][m][n][p][q][r][s][o]=ret2;
                   if (ret3 != 1)
                   {
                      goto endloop;
                   }
                }
              }
            }
          }
        }
      }
    } 
  }
}
:endloop

exit(0);

您还应该考虑为什么需要9维数组并尝试简化它。