Запись структуры в файл - C (СИ) (74997)
Формулировка задачи:
Как правильно будет записать структуру данных в файл, что бы затем без проблем его можно было считать?
Пытался сделать, так чтобы программа сперва проверяла есть ли уже файл с структурами, если есть - то вывести информацию из файла на экран. Если же нет,то попросить пользователя ввести информацию - заполнить структуру данных. Когда пользователь заканчивает ввод данных - занести их в файл и затем считать их из файла, т.е. вывести на экран. Заполнение проходит нормально, но дальше в файл записывается не все корректно. Помогите разобраться в чем проблема...
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define N 5
int main()
{
FILE *fail_gr;
struct knigi
{
int Nr, god;
char sifr[20], autor[20], nazvanie[20], kart_nr[9], familija[15], pas_dat[10];
} kniga[N];
int i,j,k,l;
do
{
system("cls");
printf("Vibor:\n");
printf("1 - posmtretj informaciju o knigax\n");
printf("2 - diopolnitj inf.\n");
printf("3 - \n");
printf("\n9 - Vixod\n");
scanf ("%d%*c",&k);
switch(k)
{
case 1:
system("cls");
if ((fail_gr = fopen("knigi.txt", "r")) == NULL)
{
printf("Fail ne bil najden, esli xotite zapisatj inf. o knigax vvedite cifru '1';\n");
printf("Esli xotite vernutsa nazad, viberete ljubuju druguju cufru: \n");
scanf ("%d%*c",&l);
if (l == 1)
{
system("cls");
printf("Zapolnite spisok\n");
for(i=0; l!=0; i++)
{
gramata[i].Nr = i+1;
printf("\nVvedite %d. informaciju o knige\n", i+1);
printf("Sifr knigi: ");
gets(kniga[i].sifr);
printf("Autor: ");
gets(kniga[i].autor);
printf("Nazvanie knigi: ");
gets(kniga[i].nazvanie);
printf("God vipuska: ");
scanf ("%d%*c",&kniga[i].god);
printf("Nomer karot4ki 4itatelja: ");
gets(kniga[i].kart_nr);
printf("Ego familija: ");
gets(kniga[i].familija);
printf("Pasutijuma datums: ");
gets(kniga[i].pas_dat);
printf("Esli xotite vernutsa k viboru nazmite '0';\n");
printf("Esli xotite prodolzitj zapolnenija informaciji o knigax vvedite ljubuju druguju cifru:\n");
scanf ("%d%*c",&l);
}
fail_gr = fopen("knigi.txt", "w");
for(j=0; j<i; j++)
fwrite(&kniga, sizeof(kniga), 1, fail_gr);
fclose(fail_gr);
}
else
break;
}
else
{
system("cls");
printf("Informacija o knigax\n");
for(j=0; j<i; j++)
printf("%2d%6s%15s%25s%6d%10s%15s%10s\n", kniga[j].Nr, kniga[j].sifr, kniga[j].autor, kniga[j].nazvanie,
kniga[j].god, kniga[j].kart_nr, kniga[j].familija, kniga[j].pas_dat);
system("pause");
break;
}
system("pause");
break;Решение задачи: «Запись структуры в файл»
textual
Листинг программы
#include <stdio.h>
//#include <windows.h>
#include <stdbool.h>
#include <stdlib.h>
#define N 20
typedef struct {
int Nr, god;
char sifr[20], autor[20], nazvanie[20], kart_nr[9], familija[15],
pas_dat[10];
} knigi;
knigi edit_record(int i) {
knigi kniga;
kniga.Nr = i + 1;
printf("\nVvedite %d. informaciju o knige\n", i + 1);
printf("Sifr knigi: ");
gets(kniga.sifr);
printf("Familija avtora: ");
gets(kniga.autor);
printf("Knigi nazvanie: ");
gets(kniga.nazvanie);
printf("God izdanija: ");
scanf("%d%*c", &kniga.god);
printf("Nomer karto4ki 4itatelja: ");
gets(kniga.kart_nr);
printf("Ego familija: ");
gets(kniga.familija);
printf("Data zakaza: ");
gets(kniga.pas_dat);
return kniga;
}
bool file_io_check(FILE *fail_gr, const char *name, const char *mode) {
bool fl = false;
if ((fail_gr = fopen(name, mode)) == NULL ) {
fl = false;
} else
fl = true;
return fl;
}
void read_file(FILE *fail_gr, knigi *kniga, int *size) {
//вообще-то лучше определить число записей и потом отдать в основную программу
int i = 0;
while (!feof(fail_gr))
fread(&kniga[i++], sizeof(knigi), 1, fail_gr);
*size = i - 1;
}
void write_record(FILE *fail_gr) {
}
bool check_eoi() {
int fl;
printf("Esli xotite vernutsa k viboru - vvedite cifru \'0\';\n");
printf("Esli xotite prodolzitj zapolnenie spiska - vvedite ljubuju druguju cifru:\n");
scanf("%d%*c", &fl);
if (!fl)
return false;
else
return true;
}
int main() {
knigi kniga[N] = { };
FILE *fail_gr;
int i, j, k;
bool check;
int sz = 0; // размер массиа
do {
//system("cls");
printf("Vibor:\n");
printf("1 - Posmotretj informaciju o knigax iz fajla\n");
printf("2 - Dopolnitj informaciju o knigax\n");
printf(
"3 - Raspe4atatj spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A' \n");
printf(
"4 - Sozdatj novij fail s informaciej o knigax (esli takogo netu)\n");
printf("\n9 - Vixod iz programmi\n");
scanf("%d%*c", &k);
switch (k) {
case 1:
//system("cls");
if (!file_io_check(fail_gr, "knigi.txt", "rb"))
printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");
else {
//system("cls");
read_file(fail_gr, kniga, &sz);
fclose(fail_gr);
printf("Informacija pro knigi\n");
for (i = 0; i < sz; i++)
printf("%2d%5s%13s%20s%5d%7s%13s%10s\n", kniga[i].Nr,
kniga[i].sifr, kniga[i].autor, kniga[i].nazvanie,
kniga[i].god, kniga[i].kart_nr, kniga[i].familija,
kniga[i].pas_dat);
}
//system("pause");
break;
case 2:
//system("cls");
if (!file_io_check(fail_gr, "knigi.txt", "rb+"))
printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");
else {
//
printf("Zapolnite, pozalujsta, spisok\n");
read_file(fail_gr, kniga, &sz);
knigi tmp;
while (check_eoi()) {
tmp=edit_record(sz++);
fwrite(&tmp, sizeof(knigi), 1, fail_gr);
};
fclose(fail_gr);
}
//system("pause");
break;
case 3:
//system("cls");
if (!file_io_check(fail_gr, "knigi.txt", "rb"))
printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");
else {
read_file(fail_gr, kniga, &sz);
fclose(fail_gr);
check = true;
printf(
"Spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A':\n");
for (i = 0; i < j; i++) {
if (kniga[i].autor[0] == 'A') {
printf("%s; ", kniga[i].nazvanie);
check = false;
}
}
if (check)
printf("Nebilo najdeno niodnoj knigi.");
}
printf("\n");
//system("pause");
break;
case 4:
//system("cls");
if (!file_io_check(fail_gr, "knigi.txt", "wb")) {
printf("Zapolnite, pozalujsta, spisok\n");
i = 0;
while (check_eoi()) {
kniga[i] = edit_record(i);
i++;
};
fail_gr = fopen("knigi.txt", "wb");
for (j = 0; j < i; j++)
fwrite(&kniga[j], sizeof(knigi), 1, fail_gr);
fclose(fail_gr);
} else
printf("Fail uze sushestvuet.\n");
//system("pause");
break;
case 9:
break; // exit(0);
default:
printf("\nNepraveljnij vibor.\n");
//system("pause");
break;
} //switch end
} // do end
while (k != 9);
return 0;
}