可変サイズの構造体をバイナリファイルに書き込むことはできません。また、構造体のサイズを記録せずに再度読み込むことはできません。 charポインタの代わりに固定サイズのchar配列を使用するか、可変長である必要がある場合は各要素のサイズを記録するカスタムファイル形式を使用することができます。
私はもっと良いことがなかったので、私はあなたが探していることを望む小さなプログラムを書いた。エラーチェックなし。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct {
int offset;
int length;
char *data;
} log_record;
void write_to_file(const char *filename)
{
log_record lr;
const int num_records = 10;
char buf[100];
int i;
FILE *fp;
fp = fopen(filename, "wb");
for(i = 0; i < num_records; ++i)
{
sprintf(buf, "Data entry %d goes here. Beware of size limit!", i);
lr.length = strlen(buf) + 1;
lr.offset = i;
lr.data = malloc(sizeof(char) * lr.length);
strncpy(lr.data, buf, lr.length);
fwrite(&lr.offset, sizeof(lr.offset), 1, fp);
fwrite(&lr.length, sizeof(lr.length), 1, fp);
fwrite(lr.data, sizeof(char), lr.length, fp);
free(lr.data);
}
fclose(fp);
}
void read_from_file(const char * filename)
{
log_record lr;
int tmp;
FILE *fp;
fp = fopen(filename, "rb");
while (feof(fp) == 0)
{
tmp = fgetc(fp);
if(tmp != EOF)
{
ungetc(tmp, fp);
fread(&lr.offset, sizeof(int), 1, fp);
fread(&lr.length, sizeof(int), 1, fp);
lr.data = malloc(sizeof(char) * lr.length);
fread(lr.data, sizeof(char), lr.length, fp);
free(lr.data);
}
}
fclose(fp);
}
int main(int argc, char *argv[])
{
write_to_file("temp.bin");
read_from_file("temp.bin");
return 0;
}
が、あなたに –
@Jugglerを取得できませんでした:代わりに、ちょうどこれを言う私の編集を確認してください。 – Donotalo
@muが短すぎます:私が提案したものは編集ではありません!私のミスを指摘してくれてありがとう。私は編集するつもりです。 – Donotalo