如何修复基于二进制文件编写文本文件

时间:2019-03-28 11:40:08

标签: 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(&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 个答案:

答案 0 :(得分:2)

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

您有多余的分号';'这里。它导致while循环连续运行,直到到达结构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]);
            }

        }

此写入文本文件的块仅运行一次,对于二进制文件的最后一种结构。  还要注意,fread返回读取的元素数量而不是读取的元素大小,因此该语句应为while(fread(&s, sizeof(s), 1, f) == 1) {...}