【发布时间】:2021-02-20 19:11:38
【问题描述】:
我想在文件中添加轮渡作为节点并跟踪前一个和下一个指针,目的是创建一个循环双向链表。船名作为主函数的参数写入终端。
添加渡轮函数代码:
int Register_ferry(char *f){
FILE *pFile;
pFile = fopen("Ferries.txt","a+");
if(pFile!=0){
FILE *dFile;
dFile = fopen("Ferries.txt","r+");
ferry *new_node=(ferry*)malloc(sizeof(ferry));
ferry *new_node2=(ferry*)malloc(sizeof(ferry));
fseek(pFile,0,SEEK_END);
if(ftell(pFile)==0){
new_node->fld=atoi(f);
new_node->next=new_node;
new_node->prev=new_node;
printf("CURR: %p\n",new_node);
printf("NEXT: %p\n",new_node->next);
printf("PREV: %p\n",new_node->prev);
}
else if(ftell(pFile)==8){
new_node->fld=atoi(f);
fseek(dFile,0,SEEK_SET);
fread(new_node2,sizeof(new_node2),1,dFile);
new_node->next=new_node2;
new_node->prev=new_node2;
new_node2->next=new_node;
new_node2->prev=new_node;
fwrite(new_node2, sizeof(new_node),1,dFile);
printf("CURR: %p\n",new_node);
printf("NEXT: %p\n",new_node->next);
printf("PREV: %p\n",new_node->prev);
}
else{
new_node->fld=atoi(f);
fseek(dFile,-8,SEEK_END);
fread(new_node2,sizeof(new_node2),1,dFile);
new_node->prev=new_node2;
fseek(dFile,0,SEEK_SET);
fread(new_node2,sizeof(new_node2),1,dFile);
new_node->next=new_node2;
printf("CURR: %p\n",new_node);
printf("NEXT: %p\n",new_node->next);
printf("PREV: %p\n",new_node->prev);
}
fwrite(new_node, sizeof(new_node), 1, pFile);
fclose(pFile);
free(new_node);
free(new_node2);
}
return 0;}
main的代码:
int main(int narg , char* argv[]){
if (strcmp(argv[1], "R")==0)
{
Register_ferry(argv[2]);
}
return 0;}
渡轮的结构:
typedef struct ferry{
int fld;
struct ferry *next;
struct ferry *prev;
}ferry;
经过一些尝试,我意识到使用 printf 命令我不会获得文件内节点的指针,而是我使用函数 malloc 创建的节点的指针。所以我的问题是我应该如何获取文件内节点的指针以保持循环双向链表应有的状态?
最后,由于某种原因,我的函数和第一个 if 没有以它们对应的 '}' 结束,但由于某种原因仍然很重要。但是终端没有提示任何错误,所以有点奇怪。
【问题讨论】:
-
请在您的问题中提供一些minimal reproducible example。这意味着带有
main的简短 C 代码
标签: c file ubuntu pointers struct