2017-09-16 11 views
0

私はバイナリファイルを使っていくつかのノードの状態に関する情報を保存しています。要点は、このバイナリファイルは1と0の数が多く、アイデアはファイルを読み込んで構造体にロードすることです。 これは、構造体の定義です:C - ファイルからリンクされたリストをロードする

typedef struct t_bitmap{ 
int estado; 
struct t_bitmap* siguiente; 
}t_bitmap; 

そして、これはそれをロードすることになっているコードです:

t_bitmap leerBitmap(char* unPath){ 
    t_bitmap bitmap; 
    FILE *fp = fopen (unPath, "rb"); 
    int i=0; 
    fseek(fp, 0, SEEK_END); 
    int tamanio = sizeof(char) * ftell(fp); 
    fseek(fp, 0, SEEK_SET); 
    char* bytes = malloc(tamanio); 
    fread(bytes, tamanio, 1, fp); 
    fclose (fp); 
    while(i<tamanio){ 
     bitmap.estado = bytes[i]; 
     bitmap = bitmap.siguiente; //This fails 
     i++; 
    }; 
    free(bytes); 
    return bitmap; 
}; 

EDIT 1

エラーは、次のとおりです。 互換性がありませんタイプ 't_bitmap'に 'struct t_bitmap *'タイプから割り当てるときにタイプする

+3

良いです。そしてあなたはここにいるの?...? – zerkms

+0

ポインタ 'struct'メンバはコンテキスト内でのみ関連します。ファイルからそれらを有効に読み取ることはできません。 –

+0

@zerkms私はビットマップを通して各エスタドに値を与える方法を知っていません。どのラインが故障したかを指摘しました。 – Marco

答えて

1

読み込んだバイトごとに新しいノードを割り当てる必要があります。

通常、リンクリストの先頭へのポインタを返すような関数を定義します(値が読み取れない場合はNULL)。 )。

あなたの関数のプロトタイプを変更しないために、私はリストの先頭に「値で返す」メタファーを保持しました。

だから、関数が値によって返される「頭」に直接保存されている最初のバイトを除き、各バイトのために新しいノードを割り当てます。

t_bitmap leerBitmap(char* unPath){ 
    t_bitmap bitmap; 
    FILE *fp = fopen (unPath, "rb"); 
    int i=0; 
    fseek(fp, 0, SEEK_END); 
    int tamanio = sizeof(char) * ftell(fp); 
    fseek(fp, 0, SEEK_SET); 
    char* bytes = malloc(tamanio); 
    fread(bytes, tamanio, 1, fp); 
    fclose (fp); 

    t_bitmap* curBitMap = &bitmap; // the current bitmap to write to 
    while(i<tamanio){ 
     if (i > 0) { // except for the first, create a new node 
      curBitMap->siguiente = malloc(sizeof(t_bitmap)); 
      curBitMap = curBitMap->siguiente; 
     } 
     curBitMap->estado = bytes[i]; 
     curBitMap->siguiente = NULL; 
     i++; 
    }; 
    free(bytes); 
    return bitmap; 
} 
関連する問題