Я пишу структуру в двоичный файл на C. Элементы char* и элементы uint8 записываются нормально, но у меня, похоже, проблема с записью элемента uint32.
мой код записи здесь.
void writeOut(record *data){
FILE *fp = fopen("output.bin","w");
int i =0;
while(data[i].Name != NULL){
fwrite(data[i].Name, NAME_LEN ,1,fp);
fwrite(&data[i].Value1, sizeof(uint8_t) ,1,fp);
fwrite(&data[i].Value2, sizeof(uint8_t) ,1,fp);
fwrite(&data[i].Id, sizeof(uint32_t) ,1,fp);
fwrite(data[i].Text, TEXT_LEN ,1,fp);
i++;
}
}
мой двоичный файл выглядит так для первой записи (в шестнадцатеричном формате) (с '|', используемым для отображения конца поля): 52 6F 64 27 72 6F 64 00 00 00 00 00 00 00 00 00 00 | 01 | 04 | 72 92 01 00 | 50 72 6F 6A 65 63 74 20 50 65 61 63 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
или в декабре 082 111 100 039 114 111 100 000 000 000 000 000 000 000 000 000 000 | 001 | 004 | 114 146 001 000 | 080 114 111 106 101 099 116 032 080 101 097 099 101 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
проблема находится в блоке «72 92 01 00» или «114 146 001 000». число, которое он должен содержать, — «103026».
У кого-нибудь есть идеи, где я ошибаюсь?
Примечание для модов: не уверен в своем выборе тегов, корректировки приветствуются.
--------ОБНОВИТЬ--------
Спасибо за вклад в файл bin. Хорошо, если он пишет правильно, я, должно быть, неправильно читаю.
это отрывок из моего чтения
int populateRecordSet(unsigned int pageSize, FILE *recordFile, record** record_set){
// read in data
unsigned char data[RECORD_LEN * pageSize];
int numOfRecords = fread(data, RECORD_LEN, pageSize, recordFile);
// convert to records
int r_pos; //note r_pos is used to show the starting point of a record in the context of the binary file
int i;
uint32_t test;
for(i=0; i < numOfRecords; i++) {
r_pos = i * RECORD_LEN;
memcpy(record_set[i]->Name, data + r_pos, NAME_LEN);
//ADD NULL AT END JUST IN CASE
record_set[i]->Name[NAME_LEN] = '\0';
record_set[i]->Species = *(data + r_pos + (NAME_LEN));
record_set[i]->Class = *(data + r_pos + (NAME_LEN+SPECIES_LEN));
//record_set[i]->Id = *(data + r_pos + (NAME_LEN+SPECIES_LEN+CLASS_LEN));
test = *(data + r_pos + (NAME_LEN+SPECIES_LEN+CLASS_LEN));
printf("%s::%"PRIu32, record_set[i]->Name,test);
getchar();
memcpy(record_set[i]->Guild, data + r_pos + (NAME_LEN+SPECIES_LEN+CLASS_LEN+ID_LEN), GUILD_LEN);
record_set[i]->Guild[GUILD_LEN] = '\0';
}
getchar();
return i;
}
Мне это кажется правильным, и оно работает для всех значений, кроме «Id».
еще раз, есть понимание?