Запись структуры в файл - 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5