我需要编写一个程序来读取文件行并将它们保存在链接队列中。我正在使用一个在每个节点中使用 void* 数据字段的库。
当我尝试打印存储的所有行时,程序会重复读取的最后一行,以获取文件中存储的行数。
我认为,由于我传递了一个指向数据字段的指针,因此每次读取新行时,存储的值都会发生变化。有办法预防吗?
附上我正在使用的函数以及队列函数和结构。
void* readfile(void* arg){
FILE* fp;
fp = fopen((char*)arg, "r");
if(fp==NULL){
fprintf(stderr, "Error opening file %s\n", (char*)arg);
exit(EXIT_FAILURE);
}
char* line= malloc(sizeof(char)*BUFSIZE); // #define BUFSIZE 1024
while(fgets(line, BUFSIZE, fp)!=NULL){
insert_tail(deque_12, (void*)line);
}
puts("File read");
fclose(fp);
return NULL;
}
> deque.h
typedef struct node{
void* data;
struct node *next;
struct node *prev;
}Node_t;
typedef struct deque{
Node_t *head;
Node_t *tail;
}Deque_t;
void insert_tail(Deque_t* d, void* data){
Node_t *newNode = malloc(sizeof(Node_t*));
newNode->data = data;
newNode->next = NULL;
if(d->head == NULL){
newNode->prev = NULL;
d->head = newNode;
}
else{
newNode->prev = d->tail;
d->tail->next = newNode;
}
d->tail = newNode;
}
考虑
readfile
中的这段代码:
char* line= malloc(sizeof(char)*BUFSIZE); // #define BUFSIZE 1024
while(fgets(line, BUFSIZE, fp)!=NULL){
insert_tail(deque_12, (void*)line);
}
为缓冲区分配一块内存,并将其地址分配给
line
。然后,对于每一行输入,它都会调用 insert_tail
来创建一个指向 line
的新节点。
结果是每个节点都指向同一块内存,即
line
所指向的内存。
要解决这个问题,您必须为每一行的数据分配不同的内存。您可以通过在
readfile
或 insert_tail
例程中为循环中的每一行分配内存来完成此操作,并在成功分配内存后,将数据从 line
复制到新分配的内存中。那么,当然,新节点的data
必须设置为指向新分配的内存,而不是指向line
。
将 char* 分配给 void* 字段
这与将
char *
值转换为 void *
值无关。