[英]C Read from file to populate linked list
我有一個txt文件,需要閱讀並填充鏈接列表。 文件結構如下
IBE0101;2016;11;20;07;50;Alvaro;Carvajal;12345678R
IBE0101;2016;11;20;07;50;Juan;Garcia;12345678R
我正在嘗試閱讀以下內容
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;
}
但是我被fscanf困在了一個無限循環中,沒有找到要告訴我進行掃描的內容? 模式似乎正確,第一次迭代可以正常工作。
tDateTime元素未在此片段上使用,但我也想獲取它。
可能您不應該自己解析該行。 有一個strtok()函數,可以為您提供由定界符分隔的標記。 但是,這並不能一call而就。 您將需要多次調用它,只要文件行中的字段數即可。
這里討論類似的方法
這樣的事情可能會起作用:
#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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.