Как исправить написание текстового файла на основе двоичного файла - PullRequest
0 голосов
/ 28 марта 2019

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

#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(&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", &s.an);
            printf("Grupa:");
            scanf_s("%d", &s.grupa);
            printf("Nr. discipline:");
            scanf_s("%d", &s.nrDisc);
            for (int i = 0; i < s.nrDisc; i++)
            {
                printf("Nota[%d] este:", i);
                scanf_s("%d", &s.note[i]);
            }
            fwrite(&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(&f, nume_binar, "rb");
    if (!f)
        printf("Eroare");
    else {
        FILE*g;
        STUDENT s;
        fopen_s(&g, nume_text, "w");
        while (fread(&s, sizeof(s), 1, f)==sizeof(s));
         {          
            fprintf(g,"%s   %s  %d  %d  %d\n ", 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, "%d\n", 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 Ответ

2 голосов
/ 28 марта 2019
while (fread(&s, sizeof(s), 1, f)==sizeof(s));

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

{          
            fprintf(g,"%s   %s  %d  %d  %d\n ", 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, "%d\n", s.note[i]);
            }

        }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...