gpt4 book ai didi

c - 如何在读取文件时分配链表节点

转载 作者:行者123 更新时间:2023-11-30 17:13:44 26 4
gpt4 key购买 nike

我已经发布了一个与此类似的问题,但我能够进一步缩小问题范围。我很确定我知道问题是什么,但我一直在思考如何解决它。

//assuming typedef struct person person;

struct person{
char first_n[100];
char last_n[100];
char middle_n[100];
struct person* next;
};


void open_file_and_read(char* file){
FILE* fp = fopen(file_name, "r");
if (fp != NULL){
while (!feof(fp)){
person* person = malloc(sizeof(person));
person->next = NULL;
while (fscanf(fp, "%s %s %s", person->first_n, person->last_n, person->middle_n) == 3){
add_to_contacts(person);
}
}
}
}

void open_write_file(char* file){
FILE* filep = fopen(file, "w");
person* copy;
for (copy = front; copy != NULL; copy=copy->next){
fprintf(filep, "%s %s %s\n", copy->last_n, copy->first_n, copy->middle_n);
}
fclose(filep);

}

void add_to_contacts(person* person){
printf("last_name: %s", person->last_name);
if (head == NULL){
person->next = head;
head = person;
else{
person->next = head;
head = person;
}
}


int main(int argc, char * argv[])
{
char* inputFilename = argv[1];
if (inputFilename == NULL){
inputFilename = "myRolodex";
}
open_read_file(inputFilename);
char command;
while (command != 'Q' && command != 'q'){
printf("STARTING TO READ COMMAND\n");
command = read_command(inputFilename);
evaluate_command(command);
}
open_write_file(inputFilename);
clear_rolodex();

printf 将文件中的所有内容作为一个节点打印出来。例如:文件包含:
鲍勃·李·史蒂夫
Mike Steven Noel 第一个、最后一个、中间
詹姆斯·阮·李

printf 打印出 LeeStevenNguyen。这些应该是分开的。

我相信问题与 malloc 仅被调用一次有关,而我真正需要的是每次 scanf 时都调用它。但是,我无法在 while...fscanf 循环下移动 person* person = malloc(sizeof(person)); 因为 fscanf 依赖于具有 person 已经创建。那么我该如何分配每个新人呢?类似的任务将在几个小时内完成,我花了过去 10 个小时试图让一切正常工作,我相信这是最重要的部分。

谢谢

编辑更多详细信息:我的 add_to_contacts 函数中有一个打印语句,用于打印出 node->lasts_name。我还在排序函数之前添加了一条打印语句(未发布),并且它无限打印

最佳答案

有多种方法可以解决此问题。

我认为最符合你想要的是:

               person* person = malloc(sizeof(person));
person->next = NULL;
while (fscanf(fp, "%s %s %s", person->first_n, person->last_n, person->middle_n) == 3){
add_to_contacts(person);
person = malloc(sizeof(person));
person->next = NULL;
}
free(person);

这假设 add_to_contacts 插入了 malloc'd指向数据结构的指针,因此我们需要下一个 fscanf 来放置其数据位于不同位置。

完成此操作后,将始终分配一个人*最后实际上并没有传递给 add_to_contacts,所以我们当循环退出时可以并且应该释放该指针。

略有不同的是

               person* person = malloc(sizeof(person));
while (fscanf(fp, "%s %s %s", person->first_n, person->last_n, person->middle_n) == 3){
person->next = NULL;
add_to_contacts(person);
person = malloc(sizeof(person));
}
free(person);

(这个想法是唯一需要 person->next = NULL;这里大概是add_to_contacts(person),并且通过推迟person->next = NULL; 直到最后一刻我们都不必调用它在循环之外以及循环内部。)

另一种(完全不同)的方法是声明局部变量,让 fscanf 写入它们,并将它们复制到循环内新分配的 person 中。

第三种方法是使 person 成为堆栈分配(而不是 malloc'd)变量,并让 add_to_contacts 按顺序创建自己的 malloc 副本将副本插入数据结构中。

但是最后两个选项涉及 fscanf 将数据写入一处然后必须将其复制到另一个以便将其放入更大的结构中。看来您可能想避免复制。

关于c - 如何在读取文件时分配链表节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30605441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com