#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) {...}