我目前正在开发一个项目,该项目允许用户将数据存储在文件中,然后将其撤消。作为中间人,我使用的是双向链表。这样,它就会像这样运行:
输入 - >列表 - >发送文件
档案 - >列表 - >输出
但是,我发现自己无法将文件恢复到列表中。这是列表本身:typedef struct Inode2*Task;
typedef struct Inode2{
int ID;
int Priority;
int Status;
char *Description;
Person *person;
Date *creation;
Date *deadline;
Date *conclusion;
Task next;
Task previous;
}Task_node2;
使用这种结构,我使用以下函数将其写入链表的最后位置:
void TaskInsertTail(Task h,int ID,char*DESC,int PRIORITY,Date*DATAINICIO,Date*DATAPRAZO,Date*DATAFIM,int STATUS) {
Task aux=(Task)malloc(sizeof(Task_node2));
aux->ID=ID;
aux->Status = STATUS;
aux->Description = DESC;
aux->Priority = PRIORITY;
aux->creation = DATAINICIO;
aux->deadline = DATAPRAZO;
aux->conclusion = DATAFIM;
aux->next=NULL;
if(!h->next)
{
h->next=h->previous=aux;
}
else
{
aux->previous=h->previous;
aux->previous->next=aux;
h->previous=aux;
}
}
最后但并非最不重要的是,在FILE内容开始之前,打印功能:
void TaskPrint(Task h) {
h=h->next;
while(h!=NULL)
{
printf("ID:%d PRIO:%d STATUS:%d DESC:%s",h->ID,h->Priority,h->Status,h->Description);
printf("Criada:%.2d/%.2d/%.4d - Prazo:%.2d/%.2d/%.4d - ",h->creation->Day,h->creation->Month,h->creation->Year,h->deadline->Day,h->deadline->Month,h->deadline->Year);
if (h->conclusion->Year==0)
printf("Por concluir");
else
printf("Concluida:%.2d/%.2d/%.4d",h->conclusion->Day,h->conclusion->Month,h->conclusion->Year);
h=h->next;
printf("\n\n");
}
}
所有这些功能在隔离环境中运行良好,它们正确地添加元素,它们很好地分配变量,一般来说一切正常。
当我尝试从包含它们的文件开始时,问题就开始了。这是文件的结构:
561 1 1 10 10 10 10 10 10 0 0 0 FirstTask1
562 2 1 20 20 20 20 20 20 0 0 0 SecondTask2
563 3 1 30 30 30 30 30 30 0 0 0 ThirdTask3
564 4 1 40 40 40 40 40 40 0 0 0 FourthOne4
这是File-> Task函数,因为它是用int_main()编写的:
int main(){
Task TASK = TaskCreate();
FILE * database;
int i=0;
char buffer[100];
database = fopen("tasks.txt","r");
if (NULL == database){perror("opening database file");exit(0);}
while(!feof(database)){
Date *D1=DateCreate();Date *D2=DateCreate();Date *D3=DateCreate();
int ID, PRIO, STATUS;
char DESC[100];
int D1Day,D1Month,D1Year, D2Day,D2Month,D2Year, D3Day,D3Month,D3Year;
fscanf(database,"%d%d%d%d%d%d%d%d%d%d%d%d",&ID,&PRIO,&STATUS,&D1Day,&D1Month,&D1Year, &D2Day,&D2Month,&D2Year, &D3Day,&D3Month,&D3Year);
fgets(DESC,101,database);
D1->Day=D1Day;D1->Month=D1Month;D1->Year=D1Year;
D2->Day=D2Day;D2->Month=D2Month;D2->Year=D2Year;
D3->Day=D3Day;D3->Month=D3Month;D3->Year=D3Year;
TaskInsertTail(TASK,ID,DESC,PRIO,D1,D2,D3,STATUS);
}
TaskPrint(TASK);//TST
fclose(database);
return(0);
}
尽管它有点乱,但应该完美无缺。然而,我发现它在列表中产生了一个额外的元素,这是倒数第二个的重复。以下是我运行时的结果:
ID:561 PRIO:1 STATUS:1 DESC: FourthOne4
Criada:10/10/0010 - Prazo:10/10/0010 - Por concluir
ID:562 PRIO:2 STATUS:1 DESC: FourthOne4
Criada:20/20/0020 - Prazo:20/20/0020 - Por concluir
ID:563 PRIO:3 STATUS:1 DESC: FourthOne4
Criada:30/30/0030 - Prazo:30/30/0030 - Por concluir
ID:564 PRIO:4 STATUS:1 DESC: FourthOne4
Criada:40/40/0040 - Prazo:40/40/0040 - Por concluir
ID:564 PRIO:4 STATUS:1 DESC: FourthOne4
Criada:40/40/0040 - Prazo:40/40/0040 - Por concluir
所以,观察:
复制最后一个元素(考虑不应该存在的循环); 搞砸了DESC元素,基本上用最后一个覆盖其他元素; 我的问题是,我该如何解决这个问题?我的信念是,我正在使用fgets()弄乱一些东西,我应该使用fscanf()读取DESC字符串,但是我的每次尝试都失败了。我不完全清楚这些功能是如何运作的,我的课程上并没有详细说明,我只是被告知要使用它们,而我自己的研究无关紧要,因为我对它们一无所知或任何类似的东西。
最后,这是我想要获得的输出:
ID:561 PRIO:1 STATUS:1 DESC: FirstTask1
Criada:10/10/0010 - Prazo:10/10/0010 - Por concluir
ID:562 PRIO:2 STATUS:1 DESC: SecondTask2
Criada:20/20/0020 - Prazo:20/20/0020 - Por concluir
ID:563 PRIO:3 STATUS:1 DESC: ThirdTask3
Criada:30/30/0030 - Prazo:30/30/0030 - Por concluir
ID:564 PRIO:4 STATUS:1 DESC: FourthOne4
Criada:40/40/0040 - Prazo:40/40/0040 - Por concluir
任何帮助都非常感谢,即使只是为了抓住我正在做的事情,因为我已经在这个项目中遇到了我的第一个死胡同,并且它已经让我退了好几个小时......
提前致谢。
编辑:忘记添加DateCreate和TaskCreate函数。它们类似,所以我只发布一个TaskCreate:
Task TaskCreate() {
Task aux=(Task)malloc(sizeof(Task));
aux->next=NULL;
aux->previous=NULL;
return aux;
}