Как исправить запись текстового файла на основе двоичного файла

#c

#c

Вопрос:

Я создаю текстовый файл на основе двоичного файла, считываю записи из двоичного файла и записываю их в текстовый файл. Первая подпрограмма предназначена для создания двоичного файла, а вторая — для создания текстового файла.

 #include<stdio.h>
typedef struct {
    char CNP[14];
    char nume[30];
    int an;
    int grupa;
    int nrDisc;
    int note[20];
}STUDENT;

void creare(char*nume) {
    FILE*f;
    STUDENT s;
    fopen_s(amp;f, nume, "wb");
    if (!f)
        printf("Eroare");
    else {
        printf("CNP:");
        gets(s.CNP);
        while (!feof(stdin)){
            printf("Nume:");
            gets(s.nume);
            printf("An:");
            scanf_s("%d", amp;s.an);
            printf("Grupa:");
            scanf_s("%d", amp;s.grupa);
            printf("Nr. discipline:");
            scanf_s("%d", amp;s.nrDisc);
            for (int i = 0; i < s.nrDisc; i  )
            {
                printf("Nota[%d] este:", i);
                scanf_s("%d", amp;s.note[i]);
            }
            fwrite(amp;s, sizeof(s), 1, f);
            getchar();
            printf("CNP:");
            gets(s.CNP);
        }
        fclose(f);
    }
}


void raport(char*nume_binar, char*nume_text) {
    FILE*f;
    fopen_s(amp;f, nume_binar, "rb");
    if (!f)
        printf("Eroare");
    else {
        FILE*g;
        STUDENT s;
        fopen_s(amp;g, nume_text, "w");
        while (fread(amp;s, sizeof(s), 1, f)==sizeof(s));
         {          
            fprintf(g,"%s   %s  %d  %d  %dn ", s.CNP, s.nume, s.an, s.grupa, s.nrDisc);
            for (int i = 0; i < s.nrDisc; i  )
            {
                fprintf(g, "Nota %d este:", i);
                fprintf(g, "%dn", s.note[i]);
            }

        }

        fclose(g);

    }
    fclose(f);
}




void main() {
    char nume_fisier[] = "Student.dat";
    char nume_fisier_txt[] = "Raport.txt";
    //creare(nume_fisier);
    raport(nume_fisier, nume_fisier_txt);
}

  

Например, я записываю 2 записи в двоичный файл, но в текстовом файле отображается только последняя запись.

Ответ №1:

 while (fread(amp;s, sizeof(s), 1, f)==sizeof(s));
  

Здесь у вас стоит дополнительная точка с запятой ‘;’. Это приводит к тому, что цикл while выполняется непрерывно, пока не достигнет конца файла, структура которого содержит последнюю структуру.
Это означает, что

 {          
            fprintf(g,"%s   %s  %d  %d  %dn ", s.CNP, s.nume, s.an, s.grupa, s.nrDisc);
            for (int i = 0; i < s.nrDisc; i  )
            {
                fprintf(g, "Nota %d este:", i);
                fprintf(g, "%dn", s.note[i]);
            }

        }
  

этот блок записи в текстовый файл выполняется только один раз и для последней структуры двоичного файла.
Также обратите внимание, что fread возвращает количество прочитанных элементов, а не размер прочитанных элементов, поэтому этот оператор должен быть while(fread(amp;s, sizeof(s), 1, f) == 1) {...}