heap에 할당되어 있는 자료를 파일에 쓰는 방법
글쓴이: kernelbomb / 작성시간: 화, 2004/04/06 - 5:43오후
안녕하세요?
사용자 입력을 받은 값을 heap에 할당하고 그것을 파일에다 저장할려고
하는데 잘 안되네요.
struct userinfo { int index; char user_name[10]; char *user_comment; };
위와같은 구조체를 이용해서 사용자 정보를 입력받습니다.
int main(int argc, char **argv) { struct userinfo ptr; FILE *fp; ptr.index = 1; strcpy(ptr.user_name, "tester"); ptr.user_comment = (char *)malloc(strlen(argv[2])); strcpy(ptr.user_commet, argv[2]); fp = fopen(argv[1], "wb"); if(fp == NULL) { error_sys("file open error!"); } fwrite(&ptr, sizeof(ptr), 1, fp); fclose(fp); return 0; }
예를 들어 위와 같이 할 때, 구조체의 user_comment 멤버가 포인터이고
인자로 받게 되는 문자열 만큼만 메모리를 할당해서 그 정보를 파일에 쓰려고
하거든요.
실제로 파일에 써지는걸 보면 user_comment의 포인터 값만 써지게 되던데,
실제 값까지 써지게 하는 방법이 없을까요?
fwirte();에서 sizeof(ptr) 하니 당연히 그 그조체 크기만큼만 저장된다는건
알꺼 같거든요. user_comment에서 가리키는 heap에 저장되어 있는 데이터
도 같이 파일에 저장할 방법이 없을런지요?
초보라 너무 헷갈리네요. ㅜㅜ; 도와 주세요~
Forums:
문자열 저장을 위한 포인터 배열을 하나더 선언하여 문자열을 저장후
문자열 저장을 위한 포인터 배열을 하나더 선언하여 문자열을 저장후
포인터를 *body에 저장하면 되지 않을까요.. ^^
안될라나 ㅠㅠ
개발자들의 궁극적 비전은 ?
구조체안에 포인터가 있어서 그렇습니다.fprintf등으로 각 멤버를
구조체안에 포인터가 있어서 그렇습니다.
fprintf등으로 각 멤버를 텍스트로 저장하세요. fwrite가 쓰기 편하것 같지만
바이너리로 저장되기 때문에 이식성을 보장할 수 없습니다.
fprintf를 쓰던 fwrite를 쓰던간에 저장된것을 읽어올때의 문제는 계속
남아있지요. 이건 간단하지 않은 문제인데.. 혹시라도 더 묻지마세요. 전 자신없음.
그리고 ptr.user_comment = (char *)malloc(strlen(argv[2]));
이 줄은 다음과 같이 고쳐쓰셔야 됩니다.
가변 데이터 구조체
방법1. 스트링 크기 고정
데이터 사이즈를 정해놓습니다.
최대 몇자~를 정해놓는것이죠.
구조체 안에 배열선언하고, 입력 스트링을 최대 자수에 맞추어 잘라버립니다. 종료문자 처리도 잊지 말구요.
방법2. 가변 크기의 스트링을 구조체 외부에 두기
구조체 안에 스트링 사이즈의 변수를 하나 만들어두고 구조체를 태그처럼 이용하는 겁니다. 파일에 저장된 구조체 이후의 스트링 사이즈 만큼의 데이터는 스트링 이고, 그 이후에 또다시 구조체가 올수 있겠죠. 팩을 고려해 줘야 합니다.
구조체 안의 포인터가 무얼 가리키건 간에, 포인터가 가리키는 데이터는 구조체에 포함되지 않습니다. 즉, 구조체를 저장하면 포인터만 저장될 뿐 포인터가 가리키는 런타임 주소에 저장된 입력 스트링은 프로그램 종료와 함께 사라질 뿐입니다. 배열이라면 구조체 안에 자리를 마련할 수도 있고, 구조체를 파일에 저장하면 당연히 구조체 안의 데이터도 저장됩니다.
머나먼 땅으로 우리 동무가 이제 떠나간다네.
고향의 바람이 불어와 동무 뒤를 따르고
사랑스러운 도시가 푸른 이내 속에서 사라지네.
정든 집, 푸른 동산, 부드러운 눈길도...
댓글 달기