Не войти в условие if, несмотря на выполнение условий

У меня есть следующий код, и компилятор не показывает мне никаких сообщений об ошибках или предупреждений. Но хотя условия выполнены, это не делает то, что я хочу.

#include <stdio.h>

int main()
{
    FILE *f,*g;
    f = fopen("MPCORB_Distant.txt","r");
    g = fopen("MPCORB_Distant_AvgKBOValues.txt","w");
    float Nbr,H,G,Epoch,M,w,W,i,e,n,a,UP,Ref,Obs,Opp,Arc,rms,Pert1,Pert2,
        Comp,Type,Name,LastObs;
    float Res_a,Res_e,Res_i,Res_W,Res_w;

    while(!feof(f))
    {
        fscanf(f,"%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n",
            &Nbr,&H,&G,&Epoch,&M,&w,&W,&i,&e,&n,&a,&UP,&Ref,&Obs,&Opp,&Arc,&rms,&Pert1,
            &Pert2,&Comp,&Type,&Name,&LastObs);

        if ( a > 60 )
        {
            fprintf(g,"%f %f %f %f %f\n",a,e,i,W,w);
        }
        else
        {
        }
    }

    fclose(f);
    fclose(g);

    return 0;
}

Когда я пишу printf("Hello\n"); внутри условия else, запись не прекращается. Кажется, что вообще не входит в if-условие, несмотря на то, что условие выполняется довольно скоро в списке файла, который читается.


person Lucas    schedule 09.01.2015    source источник
comment
Не могли бы вы выложить текстовый файл?   -  person Josh Engelsma    schedule 10.01.2015
comment
просто отметьте содержимое этой страницы и сохраните его в файл .txt: minorplanetcenter.net/ iau/MPCORB/Distant.txt   -  person Lucas    schedule 10.01.2015


Ответы (1)


Я не проверял это, но я думаю, что проблема в том, что fscanf неправильно читает строку. Вы должны проверить возвращаемое значение fscanf на наличие ошибки EOF/преобразования вместо использования feof и полагаться на успех операции чтения.

Этот вопрос здесь: Использование fscanf() с использованием feof() похоже описывает ту же проблему и некоторые Подробности о feof приведены в первом ответе на этот вопрос: (файл) )» всегда неправильно? .

person frow    schedule 09.01.2015
comment
Я прочитаю это. Но мы научились этому так, и это всегда работало так, как я хотел. - person Lucas; 10.01.2015
comment
А как насчет: while(fscanf(f,%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f % f %f %f\n,&Nbr,&H,&G,&Epoch,&M,&w,&W,&i,&e,&n,&a,&UP,&Ref,&Obs,&Opp,&Arc,&rms,&Pert1,&Pert2,&Comp,&Type, &Name,&LastObs) != EOF) { printf(%f %f %f %f %f\n,a,e,i,W,w); } В .txt файле есть не только цифры, но и буквы. может и в этом проблема? - person Lucas; 11.01.2015
comment
Да, я так думаю - если fscanf не может разобрать определенную строку, он оставит ее непроанализированной. Вы можете прочитать строку (например, с помощью fgets), а затем проанализировать ее вручную с помощью sscanf. Если строка не может быть проанализирована, то программа все равно продолжит работу, так как fgets продолжит чтение вашего файла. - person frow; 12.01.2015
comment
FILE *f,*g; f = fopen("MPCORB_Distant.txt","r"); g = fopen("MPCORB_Distant_AvgKBOValues.txt","w"); double Nbr,H,G,Epoch,M,w,W,i,e,n,a,UP,Ref,Obs,Opp,Arc,rms,Pert1,Pert2,Comp,Type,Name,LastObs; double Res_a,Res_e,Res_i,Res_W,Res_w; int c; while ((c = fgetc(f)) != EOF) { fscanf(f,"%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n",&Nbr,&H,&G,&Epoch,&M,&w,&W,&i,&e,&n,&a,&UP,&Ref,&Obs,&Opp,&Arc,&rms,&Pert1,&Pert2,&Comp,&Type,&Name,&LastObs); fprintf(g,"%.8lf %.8lf %.8lf %.8lf %.8lf\n",w,W,i,e,a); } лучше. Но можете ли вы привести мне минимальный пример? - person Lucas; 12.01.2015