Funkcją fwrite() i zapis struktury do pliku- C

0

Witam,

mam taki problem z funkcją fwrite(),że przy zapisie struktury do pliku,funkcja myli typ "int" z typem "char" i zapisuje mi każdą cyfrę jako odpowiednik jej litery w kodzie ascii.

Moja struktura wygląda tak:

 
struct electronic {
char name[50];
int value;
char unit[10];
int quantity;
};

a funkcja fwrite tak:

 fwrite (&acc[temp_data_num], sizeof(struct electronic), num_of_struct_to_save, data_file)

gdzie acc[] to tablica struktur typu electronic.

O co jej może chodzić? Taki przykład zapisywania struktur był w książce i według autora działa - niestety nie u mnie...
Będę wdzięczny za odpowiedź.
Pozdrawiam

1

Binarnie kolego, binarnie.

0

To nie to na pewno,bo plik jest otwierany binarnie.

A dokładnie:

data_file=fopen("library.dat","a+b") 
1

Pamiętaj, że struktura przy różnych ustawieniach kompilacji może mieć różną wielkość, ze względu na wyrównanie. Struktury zapisywane do pliku zawsze powinny mieć zdefiniowany od górnie rodzaj upakowania!

1

Każdy odczyt i zapis binarny zależy od tego w jaki sposób rozkładasz dane w strukturze. Zapis i odczyt binarny Twojej struktury zrobiłbym w ten sposób:

#include<stdio.h>
#include<string.h>

struct Electronic {
    char name[50];
    int value;
    char unit[10];
    int quantity;
};

void writeStructure(const char *filename, const struct Electronic *data){
    FILE *file = fopen(filename, "wb");
    if(file){

        // Zapisanie wielkości tablicy, dzięki czemu uniezależnisz się od
        // rozmiaru typu danych łańcuchowych.
        int arraySize = sizeof(data->name) / sizeof(data->name[0]);
        fwrite(&arraySize,sizeof(int),1,file);
        fwrite(data->name,sizeof(char),sizeof(data->name),file);

        fwrite(&data->value,sizeof(int),1,file);

        arraySize = sizeof(data->unit) / sizeof(data->unit[0]);
        fwrite(&arraySize,sizeof(int),1,file);
        fwrite(data->unit,sizeof(char),sizeof(data->unit),file);

        fwrite(&data->quantity,sizeof(int),1,file);

        fclose(file);
    }
}

void readStructure(const char *filename, struct Electronic *destination){
    FILE *file = fopen(filename, "rb");
    if(file){

        // Odczyt wielkości zapisanego c-stringa.
        // Dzięki temu wiesz jakiej wielkości tablica była zastosowana w strukturze.
        int arraySize = 0;
        fread(&arraySize, sizeof(int),1,file);
        fread(&destination->name,sizeof(char),arraySize,file);

        fread(&destination->value,sizeof(int),1,file);

        fread(&arraySize,sizeof(int),1,file);
        fread(&destination->unit,sizeof(char),arraySize,file);

        fread(&destination->quantity,sizeof(int),1,file);

        fclose(file);
    }
}

void printStructure(const struct Electronic *data){
    printf("Name: %s\nValue: %d\nUnit: %s\nQuantity: %d\n", data->name, data->value, data->unit, data->quantity);
}

int main(){
    struct Electronic data;
    strcpy(data.name,"Terminator");
    data.value = 256;
    strcpy(data.unit,"T-800");
    data.quantity = 128;

    writeStructure("test.bin", &data);

    struct Electronic newData;
    readStructure("test.bin", &newData);

    printStructure(&newData);

    return 0;
}

Format zapisu wygląda następująco:
[wielkość data->name][data->name][data->value][wielkośc data->unit][data->unit][data->quantity]

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