2016-11-14 8 views
0

リンクリストを読み込んで読み込む必要のあるtxtファイルがあります。ファイル構造は、以下のCリンクリストにファイルを読み込む

IBE0101;2016;11;20;07;50;Alvaro;Carvajal;12345678R 
IBE0101;2016;11;20;07;50;Juan;Garcia;12345678R 

である私はそれをやって読んしようとしています、次の私は、関数fscanfは、私が上のスキャンに言った見つけないで、無限ループにはまりしかし

tPassenger * ops_loadPassengersList() 
{ 
    tPassenger * retValue; 

    retValue = malloc(sizeof(tPassenger)); 

    tPassenger *lastPassenger = retValue; 

    // Open file handle with read mode 
    FILE *file = fopen(OPS_PASSENGERS_FILE, "r"); 

    // Loop until end of file 
    while(!feof(file)) { 
     tDateTime date; 
     fscanf(file, "%[^;];%d;%d;%d;%d;%d;%[^;];%[^;];%[^;]\n", lastPassenger->name, &date.year, &date.month, &date.day, &date.hour, &date.minute, lastPassenger->name, lastPassenger->surname, lastPassenger->dni); 
     printf(lastPassenger->name); 
     if(!feof(file)) { 
      lastPassenger->nextPassenger = malloc(sizeof(tPassenger)); 
      lastPassenger = lastPassenger->nextPassenger; 
     } 
    } 


    // Close file handle 
    fclose(file); 

    return retValue; 
} 

?最初の反復がうまく動作するパターンが正しいようです。

tDateTime要素はこの部分では使用されていませんが、取得したいと思います。

+0

あなたはどちらか 'はfopen()'、 'fscanfは()'、または 'malloc関数の戻り値をチェックしていません() '?そして、あなたは 'lastPassenger-> name'を2回読み込んでいます。 – DevSolar

+0

さて、私はそれを明確にするためにいくつかの行を削除しました。うん、問題はfscanfにあります。最初の反復で9(良い)を返しますが、残りの部分では0を返します。 –

+0

他の多くの変換指定子とは対照的に、 '[]' *は空白をスキップしません。 Windows上のデータファイルを処理することによって導入された最初の行の改行( '\ r')と一致しないでしょうか? – DevSolar

答えて

1

おそらく自分で行を解析するべきではありません。区切り文字で区切られたトークンを与えることができるstrtok()関数があります。しかし、これは1つの呼び出しですべてのfeildsを一緒に与えることはありません。フィールドの数がファイルの行にある回数だけ呼び出す必要があります。

同様の方法がhereは、このような

1

何かが仕事ができる議論されています

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

#define MAXCHAR 100 

typedef struct { 
    int yyyy, mm, dd; 
} date_t; 

typedef struct { 
    int hh, min; 
} times_t; 

typedef struct node node_t; 

struct node { 
    char *passenger_num, *name, *lastname, *dni; 
    date_t date; 
    times_t times; 
    node_t *next; 
}; 

typedef struct { 
    node_t *head; 
    node_t *foot; 
} list_t; 

list_t *create_list(void); 
list_t *insert_nodes(list_t *list, FILE *filename); 
void free_list(list_t *list); 
void print_list(list_t *list); 
void exit_if_null(void *ptr, const char *msg); 
void *malloc_str(size_t bytes); 

int 
main(int argc, char const *argv[]) { 
    FILE *filename; 
    list_t *list; 

    if ((filename = fopen("passengers.txt", "r")) == NULL) { 
     fprintf(stderr, "%s\n", "Error reading file!"); 
     exit(EXIT_FAILURE); 
    } 

    list = create_list(); 

    list = insert_nodes(list, filename); 

    print_list(list); 

    free_list(list); 
    list = NULL; 

    return 0; 
} 

list_t 
*insert_nodes(list_t *list, FILE *filename) { 
    char line[MAXCHAR]; 
    node_t *newnode; 
    char *passenger, *name, *lastname, *dni; 
    char *yyyy, *mm, *dd, *hh, *min; 

    while (fgets(line, MAXCHAR, filename) != NULL) { 
     passenger = strtok(line, ";"); 
     yyyy = strtok(NULL, ";"); 
     mm = strtok(NULL, ";"); 
     dd = strtok(NULL, ";"); 
     hh = strtok(NULL, ";"); 
     min = strtok(NULL, ";"); 
     name = strtok(NULL, ";"); 
     lastname = strtok(NULL, ";"); 
     dni = strtok(NULL, "\n"); 

     newnode = malloc(sizeof(*newnode)); 
     exit_if_null(newnode, "Node Allocation"); 

     newnode->date.yyyy = atoi(yyyy); 
     newnode->date.mm = atoi(mm); 
     newnode->date.dd = atoi(dd); 
     newnode->times.hh = atoi(hh); 
     newnode->times.min = atoi(min); 

     newnode->passenger_num = malloc_str(strlen(passenger)); 
     strcpy(newnode->passenger_num, passenger); 

     newnode->name = malloc_str(strlen(name)); 
     strcpy(newnode->name, name); 

     newnode->lastname = malloc_str(strlen(lastname)); 
     strcpy(newnode->lastname, lastname); 

     newnode->dni = malloc_str(strlen(dni)); 
     strcpy(newnode->dni, dni); 

     newnode->next = NULL; 
     if (list->foot == NULL) { 
      list->head = newnode; 
      list->foot = newnode; 
     } else { 
      list->foot->next = newnode; 
      list->foot = newnode; 
     } 

    } 
    return list; 
} 

void 
*malloc_str(size_t bytes) { 
    void *ptr = malloc(bytes+1); 
    exit_if_null(ptr, "Initial Allocation"); 
    return ptr; 
} 

void 
print_list(list_t *list) { 
    node_t *curr = list->head; 

    printf("Nodes inserted into linked list:\n"); 
    while(curr) { 
     printf("%s;%4d;%2d;%2d;0%d;%2d;%s;%s;%s\n", 
       curr->passenger_num, curr->date.yyyy, 
       curr->date.mm, curr->date.dd, 
       curr->times.hh, curr->times.min, 
       curr->name, curr->lastname, curr->dni); 
     curr = curr->next; 
    } 
} 

void 
free_list(list_t *list) { 
    node_t *curr, *prev; 
    curr = list->head; 
    while (curr) { 
     prev = curr; 
     curr = curr->next; 
     free(prev); 
    } 
    free(list); 
} 


list_t 
*create_list(void) { 
    list_t *list = malloc(sizeof(*list)); 
    exit_if_null(list, "Initial Allocation"); 
    list->head = NULL; 
    list->foot = NULL; 
    return list; 
} 

void 
exit_if_null(void *ptr, const char *msg) { 
    if (!ptr) { 
     printf("Unexpected null pointer: %s\n", msg); 
     exit(EXIT_FAILURE); 
    } 
} 
関連する問題