2017-05-09 22 views
1

私の質問は簡単なものである構造体「C」の配列のサイズを大きく:動的に私は、次の構造体を宣言した...

struct Address { 
    int id; 
    int set; 
    char *name; 
    char *email; 
}; 

struct Database { 
    struct Address rows[512]; 
}; 

struct Connection { 
    FILE *file; 
    struct Database *db; 
}; 

は今、私は私の「接続内の私の「データベース」という明確な初期化しましたいくつかのダミーのアドレスを持っています。私はこの後、データベースを取り、と私の「接続」のstruct内のファイルに保存します。私のアドレスは512をIE用、私は私の「データベース」構造体の内側の行の所定数を持っているとき、すべてが素晴らしい作品

void Database_write(struct Connection *conn){ 
    rewind(conn->file); 

    int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file); 
     if(rc != 1){ 
     die("Failed to write database.\n",conn); 
     } 

    rc = fflush(conn->file); 
     if(rc == -1){ 
     die("Cannot flush database.\n",conn); 
     } 

しかし、行の数を動的にしたいのですが?おそらく関数に渡されたパラメータとしての?今問題があることを、MAX_ROWSが関数に渡されたのparamされた状態で

conn->db->rows = (struct Address*) malloc(sizeof(struct Address)*max_rows); 

:しかし、私は...以下を使用して

struct Database { 
    struct Address *rows; 
}; 

とし、このポインタにスペースを割り当てるを試してみました私が行って、これを私の "Connection"構造体内のファイルに保存しようとすると、ポインタ "struct Address * rows;"を保存するだけですスペースが割り当てられたデータではありません。どのようにこの割り当てられた領域を保存するか、または構造体の中にあらかじめ決められた配列を持っていて、それを動的に成長させるための提案はありますか?

ありがとうございます!

+3

あなたの新しく更新された書き込みコードは動作しません。 –

+0

あなたはポインタを保存する必要がありますか?構造体をバイトとしてファイルにダンプするだけでしたか?それはひどい考えです。そのファイルは、マシンのサブセット上で正しく読み取られることになります。必要なのは、プロセスのメモリにあるようにダンプバイトだけでなく、データの論理表現をファイルに書き出すことです。 – StoryTeller

+2

構造体を解析するシリアル化ルーチンを書く必要があります。 – Lundin

答えて

3

アドレスの動的番号を作成する場合は、mallocと正しいトラックにあります。

conn->db->rows = (struct Address*) malloc(sizeof(struct Address)*max_rows); 

しかし、その後、あなたはDatabase_writeでファイルに書き出すという問題があります。これは、動的に割り当てられた構造には、その中に配線された行数がなくなったためです。あなたはどのように書くか、多くの行のDatabase_write

    1. へのパスを変更する必要があります。
    2. fwrite行を調整してすべての行を書き出します。

    あなたは持っていた:あなたは、今のような何か必要

    void Database_write(struct Connection *conn) 
    { 
        rewind(conn->file); 
    
        int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file); 
        if(rc != 1){ 
         die("Failed to write database.\n",conn); 
        } 
    ... 
    

    void Database_write(struct Connection *conn, int num_rows) 
    { 
        rewind(conn->file); 
    
        int rc = fwrite(conn->db, sizeof(struct Database), num_rows, conn->file); 
        if(rc != num_rows) 
        { 
         die("Failed to write database.\n",conn); 
        } 
    
    ... 
    

    をまた 多くの行をすることになっているかを記録するために、データベースの構造体への行数を追加することができますファイル内にある:

    struct Database 
    { 
        int num_rows; 
        struct Address *rows; 
    }; 
    

    Inあなたはを書いてください最初にファイルの行の数は のnum_rowsを書く構造アドレス

    のフライで行数を変更する場合は、reallocを検索することもできます。ヒント - 注意して使用し、戻り値に細心の注意を払ってください。

  • 関連する問題