C - 从文件中读取多个整数和一个str到链接列表

时间:2018-05-19 19:25:04

标签: c

我目前正在开发一个项目,该项目允许用户将数据存储在文件中,然后将其撤消。作为中间人,我使用的是双向链表。这样,它就会像这样运行:

输入 - >列表 - >发送文件

档案 - >列表 - >输出

但是,我发现自己无法将文件恢复到列表中。这是列表本身:

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;
}

0 个答案:

没有答案