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]