我正在用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++;
    }   
}

我的二进制文件对于记录1来说是这样的(以十六进制表示)(用'|'表示指向结束的字段): 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 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 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”以外的所有值

再一次,有什么见识?

===============>>#1 票数:5

正如其他人指出的那样,您的二进制表示形式看起来正确。 但是,您应该看一下用于访问此文件的模式。 编写二进制文件时,应以“ wb”模式打开,而读取文件为“ rb”。

在* nix系统上,这并不重要。 在Windows上,根据我的经验,这很重要。 错误的模式很容易导致后续读取无法正确工作。

===============>>#2 票数:4

没错 72 92 01 00是正确的字节序列,用于将数字103026表示为32位的Little-Endian整数。

===============>>#3 票数:3 已采纳

72 92 01 00是正确的十六进制/字节表示形式,十进制为103026,如果您打算将其写为little-endian(即,最低有效字节在前)。 如果您以little-endian方式编写它并以big-endian方式(最重要的字节在前)来读取它,那就是您的问题-字节序在读取和写入时必须相同。

  ask by TrewTzu translate from so

未解决问题?本站智能推荐: