2016-03-26 3 views
-2

私が作成しているプログラムでは、ioリダイレクトを使用してファイルを1行ずつ読み込みます。各行はリスト内のレコードです。私は構造体のリストを出力する必要がありますが、それがwhileループの中でなければできません。これまでは、forループ(i = 0、i(lessthan)list.nused; i ++)を使用していましたが、何も印刷せずにエラーもありません。どんな助けも素晴らしいだろう、ありがとう。コードの一部です:C - whileループ以外の構造体を印刷できません

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

#define NAMESIZE 20 
#define BLOCK 2 
#define BUFSIZE 512 

typedef struct { 
    char last[NAMESIZE]; 
    char first[NAMESIZE]; 
} name; 
typedef struct { 
    name name; 
    int score; 
} record; 
typedef struct { 
    record **data; 
    size_t nalloc; 
    size_t nused; 
} record_list; 
void list_init(record_list *list) { 
    list->data = NULL; 
    list->nalloc = list->nused = 0; 
} 
int make_list (record_list *list) { 
    int score; 
    size_t i; 
    char line[BUFSIZE]; 
    char fname[NAMESIZE]; 
    char lname[NAMESIZE]; 
    while (fgets(line, BUFSIZE, stdin) != NULL) { 
     if (list->nalloc == list->nused) { 
      record *rec = realloc(list->data, (list->nalloc+BLOCK)*sizeof(record)); 
      if (rec == 0) { 
       fprintf(stderr, "Unable to resize."); 
       clearerr(stderr); 
       return 1; 
      } 
      list->data = &rec; 
      list->nalloc += BLOCK; 
     } 
     if (fgets(line, BUFSIZE, stdin) == NULL) { 
      clearerr(stdin); 
      return 1; 
     } 
     sscanf(line, "%s %s %d", fname, lname, &score); 
     strcpy(list->data[list->nused]->name.first, fname); 
     strcpy(list->data[list->nused]->name.last, lname); 
     list->data[list->nused]->score = score; 
     list->nused = list->nused++; 
     //here is where it is able to print 
     //printf("%s\n", list->data[list->nused]->name.last); 
    } 
    //I would like it to print everything here 
    for (i = 0; i < list->nused; i++) { 
     printf("%s, %s: %d\n", list->data[i]->name.last, 
     list->data[i]->name.first, list->data[i]->score); 
    } 
    return 1; 
} 
int main(int argc, char *argv[]) { 
    record_list list; 
    list_init(&list); 
    make_list(&list); 
} 
+2

実際にコードをコンパイルすると主張していますか? 'list'はポインタなので、' list.nused'は無効です。したがって、 'list-> nused'でなければなりません。他の 'list'フィールドへのアクセスのいくつかについても同様です。コードをコンパイルしていないか、コードの正しいバージョンではありません。 – kaylum

+0

@kaylum申し訳ありません、今すぐコンパイルする必要があります – Bobbis

+0

"Should" compile ??実際に試しましたか?まだ間違っていてコンパイルされません。コードをコンパイルして実行することさえ気にしないようです。それであなたが説明した行動をどうやって信じることができますか? – kaylum

答えて

2

あなたはいくつかの小さな間違いを犯しました。使用 - あなたがあなたの代わりに、ポインタのポインタのレコードへのポインタを持っている必要がありますので、recordオブジェクトの数を保持するメモリのブロックのサイズを変更している

typedef struct { 
    record *data; 
    size_t nalloc; 
    size_t nused; 
} record_list; 

:まず、にrecord_listの定義を変更しますポインタのサイズ変更可能な配列を管理したい場合は後者です。これは、さらにいくつかの変更が必要になります。

  • 割り当てをrealloc呼び出しが記録データのあなたの割り当てではなく、ポインタのアクセス(->)のメンバーのメンバーへのアクセスを(.)を使用しlist->data = rec
  • なった後 - 他に言葉は、list->data[list->nused].name.first代わり

list->data[list->nused]->name.firstのもう一つの微妙な間違いはlist->nused = list->nused++がちょうど間違っているということです。それはlist->nused++またはlist->nused += 1である必要があります。

最終的な間違いは、各行を2回読むことです。 2番目の呼び出しをfgetsに削除できます。

また、割り当てているメモリの割り当てを解除する必要があります。メインの最後にfree(list.data)を追加します。

関連する問題