Запись структуры в файл - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д