Я написал код, который необходимо прочитать в серии значений из указанного пользователем файла данных (это может быть до 10 000 строк данных), которое выполняется в сначала для цикла. В каждой строке значений одна из переменных преобразуется в строку, которая определяет другой набор входных файлов (каждый из которых содержит ~ 20 000 строк данных) для загрузки, которые необходимы во втором цикле для вычислений. Это хорошо работает для первых нескольких итераций ... он читает во всем правильно, и полученные вычисления (расчеты опущены в коде ниже, потому что код создает тот же самый запрос с или без них), как и ожидалось.Сегментация Ошибка в середине вложенного цикла
Проблема заключается в том, что, когда первый цикл достигает около 600 итераций она останавливается и выдает сообщение об ошибке: ошибки сегментации (ядро сбрасывали)
Я уверен, что это проблема памяти какой-то, потому что если я «ве протестировали код, опуская 4 входных файлов во втором цикле, и это может достичь более высокого числа итераций ....
Это код:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int num, i, j;
double X, Y;//
float Z;
char the_data[25], Z_name[10], input_1[50], input_2[50], input_3[50], input_4[50], input_5[50];
double a, b, c, d, e;
printf("Enter the name of the data file you are using:\n");
scanf("%24s", &the_data);
FILE *DATA = fopen(the_data,"r");
for (j=1; j<800; j++)
{
//***************Read data from a file, the variable Z is a floating point number which, when rounded to the nearest decimal place,
//********************determines which directory to load model data from for each value of X and Y
fscanf(DATA, "%lf %lf %f\n", &X, &Y, &Z);
//round Z to the nearest 1 decimal place
Z = Z * 10;
Z = roundf(Z);
Z = Z/10;
//assign the full directory name to Z_name
sprintf(Z_name, "%.01fdirectory", Z);
//assign Z_name to input name string for path to the appropriate data file locations
sprintf(input_1, "./%s/a.txt", Z_name);
sprintf(input_2, "./%s/b.txt", Z_name);
sprintf(input_3, "./%s/c.txt", Z_name);
sprintf(input_4, "./%s/d.txt", Z_name);
sprintf(input_5, "./%s/e.txt", Z_name);
//Open the files
FILE *input1 = fopen(input_1, "r");
FILE *input2 = fopen(input_2, "r");
FILE *input3 = fopen(input_3, "r");
FILE *input4 = fopen(input_4, "r");
FILE *input5 = fopen(input_5, "r");
for (i=1; i < 10000; i++)
{
//For a given Z value, read in the corresponding values. Usually these input files have ~20000 values in each so the loop would be set to run until the end of the file
fscanf(input1, "%lf", &a);
fscanf(input2, "%lf", &b);
fscanf(input3, "%lf", &c);
fscanf(input4, "%lf", &d);
fscanf(input5, "%lf", &e);
}
//Test to see how far it gets in loop before giving up due to segmentation fault
printf("The iteration number is: %d\n", j);
}
printf("This will print if the program reaches the end of the first loop\n");
}
Я был бы признателен любые советы или указатели при работе с этим профилем я проблема. Благодаря!
Вы открываете файлы в цикле и не закрывая их, и любую надежду когда-либо закрывать их, как вы теряете ручку в следующей итерации, почему вы fscanf'ing корыта E 10000 раз в цикле и не делаете ничего со значениями, которые вы читаете? – Unimportant
Я не вижу закрытия каких-либо файлов? –
Какую ОС/платформу вы используете? – Venemo