sizeof(*bar)
이 정확합니다. &bar
이 잘못되었습니다. bar
은 포인터이므로 주소 연산자를 사용하면 안됩니다.
또한 struct를 작성하려고 시도했지만 동적으로 할당 된 배열 데이터를 작성하지 않았습니다. 사실, 데이터를 다시 읽을 때 주소가 유효하지 않으므로 구조체를 작성하는 것은 의미가 없습니다. 크기 (m
및 n
)와 배열 데이터를 써야합니다. 다시 읽을 때 malloc/calloc
구조체와 배열 공간을 다시 필요로합니다.
다음은 실행 가능한 예입니다. gsl_vector
을 double
으로 바꾸어 다른 사람이 쉽게 실행할 수 있도록했습니다.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int m, n;
int *am;
double *bn;
} Foo;
void foo_write(Foo *f, FILE *file) {
fwrite(&(f->m), sizeof(f->m), 1, file);
fwrite(&(f->n), sizeof(f->n), 1, file);
fwrite(f->am, sizeof(*(f->am)), f->m, file);
fwrite(f->bn, sizeof(*(f->bn)), f->n, file);
}
Foo *foo_read(FILE *file) {
Foo *f = malloc(sizeof(*f));
fread(&(f->m), sizeof(f->m), 1, file);
fread(&(f->n), sizeof(f->n), 1, file);
f->am = malloc(f->m * sizeof(*(f->am)));
f->bn = malloc(f->n * sizeof(*(f->bn)));
fread(f->am, sizeof(*(f->am)), f->m, file);
fread(f->bn, sizeof(*(f->bn)), f->n, file);
return f;
}
Foo *foo_alloc(int m, int n) {
Foo *f = malloc(sizeof(*f));
f->m = m;
f->n = n;
f->am = calloc(f->m, sizeof(*(f->am)));
f->bn = calloc(f->n, sizeof(*(f->bn)));
return f;
}
void foo_print(Foo *f) {
int i;
printf("%d, %d\n", f->m, f->n);
for (i = 0; i < f->m; ++i)
printf("%d ", f->am[i]);
putchar('\n');
for (i = 0; i < f->n; ++i)
printf("%.1f ", f->bn[i]);
}
void foo_free(Foo *f) {
free(f->am);
free(f->bn);
free(f);
}
int main() {
FILE *file;
Foo *bar;
int i;
bar = foo_alloc(5, 10);
for (i = 0; i < bar->m; ++i)
bar->am[i] = i;
for (i = 0; i < bar->n; ++i)
bar->bn[i] = i;
file = fopen("foo.bin", "wb");
foo_write(bar, file);
fclose(file);
foo_free(bar);
file = fopen("foo.bin", "rb");
bar = foo_read(file);
fclose(file);
foo_print(bar);
return 0;
}
당신은 쓰기와 같은
gsl_vector
의 (벡터들이 데이터 블록을 공유하지 않는, 즉, 독립적 인 가정) 읽을 수 있습니다
:
void foo_write(Foo *f, FILE *file) {
size_t i;
fwrite(&(f->m), sizeof(f->m), 1, file);
fwrite(&(f->n), sizeof(f->n), 1, file);
fwrite(f->am, sizeof(*(f->am)), f->m, file);
for (i = 0; i < f->n; ++i)
gsl_vector_fwrite(file, &(f->bn[i]));
}
Foo *foo_read(FILE *file) {
size_t i;
Foo *f = malloc(sizeof(*f));
fread(&(f->m), sizeof(f->m), 1, file);
fread(&(f->n), sizeof(f->n), 1, file);
f->am = malloc(f->m * sizeof(*(f->am)));
f->bn = malloc(f->n * sizeof(*(f->bn)));
fread(f->am, sizeof(*(f->am)), f->m, file);
for (i = 0; i < f->n; ++i)
gsl_vector_fread(file, &(f->bn[i]));
return f;
}
어를 ...'write' 그것을 (바이너리) 파일에 저장하고 다시 읽습니다. ... ... 그리고 Google이 말하지 않았습니까? – mafso
아, 그리고 진지한 의견 : 엔디안을 찾으십시오. – mafso
나는 인터넷 검색을 시도했지만 혼란스러운 것을 발견했습니다. 나는 C 프로그래머가 아니기 때문에 Google 결과에 대한 내 자신의 이해를 신뢰하기 전에 두 번 확인하고 싶습니다. – alexis