Zapisywanie struktur do plików

0

Mam problem podczas zapisu struktury do pliku binarnego, funkcja main wygląda tak:

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>

#define DLTAB 20

char wybierz(void);
void pokaz_puste(char wybor);
void pokaz_liste(void);
void anulacja(void);
void rezerwacja(void);
void czysc(void);

struct {
    int id;
    int wolne;  /*1 - wolne, 0 - zajete*/ 
    char imie[DLTAB];
    char nazwisko[DLTAB];
} samolot[12];

int main(void) {
    int licznik = 0;
    char wybor;
    FILE *rezerwacje; 
    size_t rozmiar = sizeof(samolot[0]); 
    int pobrano;
    int znacznik;
    
    if((rezerwacje = fopen("rezerwacje.bin", "rb")) == NULL) {
        puts("Nie mozna bylo otworzyc pliku!!!");
        exit(1);
    }    

    rewind(rezerwacje);

    fread(&znacznik, sizeof(int), 1, rezerwacje);

    while(fread(&samolot[licznik], rozmiar, 1, rezerwacje) == 1) ++pobrano;

    fclose(rezerwacje);

    if(znacznik == 0) {
        for(licznik = 0; licznik < 12; licznik++) {
            samolot[licznik].wolne = 1;
        }
    }

    for(licznik = 0; licznik < 12; licznik++) {
        samolot[licznik].id = licznik + 1;
    }

    for(licznik = pobrano; licznik < 12; licznik++) {
        samolot[licznik].wolne = 1;
    }
    
    while(1) {
        wybor = wybierz();
        switch(wybor) {
            case 'a' :
                pokaz_puste('A');
                break;
            case 'b' :
                pokaz_puste('B');
                break;
            case 'c' : 
                pokaz_liste();
                break;
            case 'd' :
                rezerwacja();
                break;
            case 'e' :
                anulacja();
                break;
            case 'f' :
                return 0;
                break;
            default :
                puts("Nie znana odpowiedz!!!");
                break;
        }
    }

    if((rezerwacje = fopen("rezerwacje.txt", "wb")) == NULL) {
        printf("Nie mozna bylo zapisac!!!");
        exit(1);
    }

    znacznik = 1;
    fwrite(&znacznik, sizeof(int), 1, rezerwacje);

    for(licznik = 0; licznik < 12; licznik++) {
        fwrite(&samolot[licznik], rozmiar, 1, rezerwacje);
    }

    fclose(rezerwacje);

    return 0;
} 

Nie zamieszczam reszty kodu, bo jest dość długi.
Program ma odczytać dane o zajętych miejscach, a status reszty ustawić na wolne. Znacznik oznacza, czy plik był edytowany(tworzony przez inny program). Odczytane dane są zapisywane do tablicy struktur i po edycji są zapisywane do tego samego pliku. I tu pojawia się problem, program poprawnie edytuje dane, ale po zapisie plik pozostaje bez zmian.

1

Przede wszystkim masz problem z zadaniem sensownego pytania, które by zachęcało ludzi do rozwiązania Twojego problemu (tego właściwego, nie tego z zadaniem pytania).

3

Zamieszczam w ramach ciekawostki; http://melpon.org/wandbox/permlink/IPaB1uNiZksGzwB7

struct Foo{
    int a, b;
    string str;

    void write_to(binarystream &ostream) const{
        write(a, b, str.data()).to(ostream);
    }
    
    void read_from(binarystream &istream){
        read(a, b, str).from(istream);
    }
};

int main(){
    binarystream stream;
    write(1, Foo{2, 3, "Hello World!"}, "Nice to meet you!").to(stream);
    
    int a = 0;
    Foo foo;
    string text;
    
    read(a, foo, text).from(stream);
    
    cout << a << endl
         << "Foo{a="<<foo.a << ", b="<<foo.b << ", str=\""<<foo.str << "\"}" << endl
         << text << endl;
}
0

Może mi ktoś pomóc męczę się z tym od 3 dni.

1
rezerwacje=fopen("rezerwacje.bin","rb");
pobrano=fread(samolot,sizeof(*samolot),12,rezerwacje); 
fclose(rezerwacje);
rezerwacje=fopen("rezerwacje.txt", "wb");
fwrite(samolot,sizeof(*samolot),pobrano,rezerwacje);
fclose(rezerwacje);
0

Edytowałem kod i teraz wygląda tak, działa wszystko... oprócz samego zapisywania(wiem bo rozmiar się nie zmienia)

int main(void) {
    int licznik = 0;
    char wybor;
    FILE *rezerwacje; 
    size_t rozmiar = sizeof(samolot[0]); 
    int pobrano;
    int znacznik;
    
    if((rezerwacje = fopen("rezerwacje.bin", "rb")) == NULL) {
        puts("Nie mozna bylo otworzyc pliku!!!");
        exit(1);
    }    

    rewind(rezerwacje);

    fread(znacznik, (size_t)4, 1, rezerwacje)

    pobrano = fread(samolot, sizeof(*samolot), 12, rezerwacje);

    fclose(rezerwacje);

    for(licznik = 0; licznik < 12; licznik++) {
        samolot[licznik].id = licznik + 1;
    }

    for(licznik = pobrano; licznik < 12; licznik++) {
        samolot[licznik].wolne = 1;
    }
    
    while(1) {
        wybor = wybierz();
        switch(wybor) {
            case 'a' :
                pokaz_puste('A');
                break;
            case 'b' :
                pokaz_puste('B');
                break;
            case 'c' : 
                pokaz_liste();
                break;
            case 'd' :
                rezerwacja();
                break;
            case 'e' :
                anulacja();
                break;
            case 'f' :
                return 0;
                break;
            default :
                puts("Nie znana odpowiedz!!!");
                break;
        }
    }

    if((rezerwacje = fopen("rezerwacje.txt", "wb")) == NULL) {
        printf("Nie mozna bylo zapisac!!!");
        exit(1);
    }
    
    rewind(rezerwacje);

    fwrite(samolot, sizeof(*samolot), 12, rezerwacje);

    fclose(rezerwacje);

    return 0;
0
  1. Nie zapisuje, bo plik masz otwarty do odczytu...
  2. pamiętaj, ze tak napisany program jest nieprzenośny, nawet pomiędzy tym samym kompilatorem z innymi preferencjami może być plik nieodczytywalny...
0

Na samym końcu plik jest otwierany do zapisu

0

I nie rozumiem dlaczego nieprzenośny

1 użytkowników online, w tym zalogowanych: 0, gości: 1