heap에 할당되어 있는 자료를 파일에 쓰는 방법

kernelbomb의 이미지

안녕하세요?

사용자 입력을 받은 값을 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에 저장되어 있는 데이터
도 같이 파일에 저장할 방법이 없을런지요?

초보라 너무 헷갈리네요. ㅜㅜ; 도와 주세요~

ssik425의 이미지

문자열 저장을 위한 포인터 배열을 하나더 선언하여 문자열을 저장후

포인터를 *body에 저장하면 되지 않을까요.. ^^

안될라나 ㅠㅠ

개발자들의 궁극적 비전은 ?

bluemoon의 이미지

구조체안에 포인터가 있어서 그렇습니다.
fprintf등으로 각 멤버를 텍스트로 저장하세요. fwrite가 쓰기 편하것 같지만
바이너리로 저장되기 때문에 이식성을 보장할 수 없습니다.
fprintf를 쓰던 fwrite를 쓰던간에 저장된것을 읽어올때의 문제는 계속
남아있지요. 이건 간단하지 않은 문제인데.. 혹시라도 더 묻지마세요. 전 자신없음.

그리고 ptr.user_comment = (char *)malloc(strlen(argv[2]));
이 줄은 다음과 같이 고쳐쓰셔야 됩니다.

ptr.user_comment = malloc(strlen(argv[2]) + 1); /* strlen은 null문자를 계산하지 않거든요. */
vajna의 이미지

방법1. 스트링 크기 고정
데이터 사이즈를 정해놓습니다.
최대 몇자~를 정해놓는것이죠.
구조체 안에 배열선언하고, 입력 스트링을 최대 자수에 맞추어 잘라버립니다. 종료문자 처리도 잊지 말구요.

방법2. 가변 크기의 스트링을 구조체 외부에 두기
구조체 안에 스트링 사이즈의 변수를 하나 만들어두고 구조체를 태그처럼 이용하는 겁니다. 파일에 저장된 구조체 이후의 스트링 사이즈 만큼의 데이터는 스트링 이고, 그 이후에 또다시 구조체가 올수 있겠죠. 팩을 고려해 줘야 합니다.

구조체 안의 포인터가 무얼 가리키건 간에, 포인터가 가리키는 데이터는 구조체에 포함되지 않습니다. 즉, 구조체를 저장하면 포인터만 저장될 뿐 포인터가 가리키는 런타임 주소에 저장된 입력 스트링은 프로그램 종료와 함께 사라질 뿐입니다. 배열이라면 구조체 안에 자리를 마련할 수도 있고, 구조체를 파일에 저장하면 당연히 구조체 안의 데이터도 저장됩니다.

머나먼 땅으로 우리 동무가 이제 떠나간다네.
고향의 바람이 불어와 동무 뒤를 따르고
사랑스러운 도시가 푸른 이내 속에서 사라지네.
정든 집, 푸른 동산, 부드러운 눈길도...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.