C,如何将String保存到二进制文件中?

时间:2017-03-20 16:01:11

标签: mysql c binary binaryfiles

我想将String数组保存到二进制文件中。 我搜索并试过,没有提出正常的二进制文件内容。 (不是像00 0A 10)想出来的(8죅?<죅?A?E죅?) - 用韩文写的。

代码的写作部分是

FILE *fp_course = fopen("KJH_course.dat", "wb");
while ((row = mysql_fetch_row(res)) != NULL) {      //JUST FOR FETCHING DATA FROM MYSQL, WORKED WELL
    printf("%s %s %s %s\n", row[0], row[1], row[2], row[3]);
        fwrite(row, sizeof(row), 1, fp_course);
};

行中的数据是{' 32141183',' JHK',' 2'} (最后一行[3]后来用于更大的数组)

我写错了什么?

2 个答案:

答案 0 :(得分:4)

sizeof运算符不返回字符串的长度,我想row是一个指针,sizeof它只是一个指针的大小,你做不到你想要的尝试方式。

您需要每个项目的长度,所以

for (int i = 0; i < 4 ; ++i) {
    fwrite(row[i], 1, strlen(row[i]), fp_course);
}

非常重要的注意事项

以这种方式写入文件的内容是无用的,因为您不知道每个字符串的长度,因此无法读回它们。

所以也许你需要做一些像

这样的事情
for (int i = 0; i < 4 ; ++i) {
    char *string;
    int length;

    string = row[i];
    length = strlen(string);

    fwrite(&length, sizeof(length), 1, fp_course);
    fwrite(string, 1, length, fp_course);
}

这样你就可以回读数据了。

答案 1 :(得分:4)

MySQL documentation has an example

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i],
              row[i] ? row[i] : "NULL");
   }
   printf("\n");
}

请注意,返回的MYSQL_ROW不一定有nul终止的字符串(根据评论,引用如下),因此您无法安全地调用strlen()列 - 而是您必须致电mysql_fetch_lengths()

  

MYSQL_ROW是一个以空字符结尾的字符串数组。 (但是,如果字段值可能包含二进制数据,则不能将这些视为以空值终止的字符串,因为此类值可能在内部包含空字节。)