Пропуск строк в файле в c - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь прочитать содержимое файла, вставить его в поля структуры и распечатать значения. Но, похоже, он игнорирует половину данных пациента, потому что каждый раз пропускает строку, содержащую данные.

Sophia Jackson 1234 141.0 1.1 

Emma Aiden 5432 142.0 1.2

Olivia Lucas 5685 143.0 1.3

Ava Liam 5672 144.0 1.4

Mia Noah 3467 145.0 1.5

Isabella Ethan 8654 146.0 1.6

Riley Mason 2567 147.0 1.7

Aria Caden 6794 148.0 1.8

Имена отформатированы примерно так, за исключением того, что они не являются символами новой строки между каждым

while(1) {
        fscanf(fp,"%s %s %i %f %f",newptr->pfn,newptr->pln,&newptr->pid,&newptr->pwt,&newptr->phgnum);
        printf("First Name: %s\n",newptr->pfn);
        printf("Last Name: %s\n",newptr->pln);
        printf("PID: %i\n",newptr->pid);
        printf("Weight: %f\n",newptr->pwt);
        printf("HG1AC: %f\n",newptr->phgnum);

        if( 5 != fscanf(fp,"%s %s %i %f %f",newptr->pfn,newptr->pln,&newptr->pid,&newptr->pwt,&newptr->phgnum)) {
             break;
        }           
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

В цикле while есть 2 вызова функции fscanf. Вы рассматриваете первый для отображения, а результаты второго вызова просто игнорируются. Это означает, что вы игнорируете половину всех данных.

После решит проблему.

while(1){

        if( 5 != fscanf(fp,"%s %s %i %f %f",newptr->pfn,newptr->pln,&newptr->pid,&newptr->pwt,&newptr->phgnum)){
             break;
        }           

        printf("First Name: %s\n",newptr->pfn);
        printf("Last Name: %s\n",newptr->pln);
        printf("PID: %i\n",newptr->pid);
        printf("Weight: %f\n",newptr->pwt);
        printf("HG1AC: %f\n",newptr->phgnum);
}
0 голосов
/ 07 мая 2018

Ваш второй вызов fscanf() читает вторую строку данных, перезаписывая данные, ранее считанные из первой строки, первой fscanf().

Вам нужен только один fscanf() в вашем цикле.

Кроме того, как вы устанавливаете / меняете newptr в цикле?

Добавление (9 мая 2018 года)

Вы должны использовать только один fscanf() вызов в вашем цикле. Кроме того, вы должны проверить результат этого вызова в верхней части цикла, чтобы определить, когда вы нажали EOF и, следовательно, когда завершить цикл.

Вы также можете позвонить feof(), чтобы проверить EOF перед прочтением следующей строки.

...