从文件

时间:2018-01-11 23:32:35

标签: c file data-structures linked-list

我将数据从文本文件导入到链接列表,但fscanf给出了奇怪的数字。

我的结构:

struct arac
{
    struct arac *next;
    char marka[15];
    char model[15];
    char paket[15];
    char renk[10];
    int yil;
    char motor[8];
    char sanz[3];
    int km;
    int kayitno;

};

这也是我的添加功能:

struct arac *aktar(struct arac *go)
{
    FILE *imptr = fopen("Yenikayit.txt","r");
    if(imptr==NULL) 
    {
        printf("\nDosya bulunamadi.");
        return NULL;
    }
    else
    {
        while(feof(imptr)!=0)
        {
            go=(arac*)malloc(sizeof(arac));
            fscanf(imptr,"\n%d %d %s %s %s %s %d %s %s",go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);
            printf("\n%d %d %s %s %s %s %d %s %s", go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);
            go->next=NULL;
            go=go->next;        
        }

    }
}

嵌入printf进行调试,以便提供此输出,程序崩溃:

 947398688 1929405816  S>,│Aæz rs\Berk Ízel\Desktop\otm-final\otm-final.exe sktop\otm-final\otm-final.exe 1818324585 \otm-final.exe al.exe
1207974467 1027954249 \Berk Ízel\Desktop\otm-final\otm-final.exe top\otm-final\otm-final.exe tm-final.exe (x88,│Gùz 1446944

2 个答案:

答案 0 :(得分:1)

您将结构成员的值赋予了 fscanf(imptr,"\n%d %d %s %s %s %s %d %s %s",go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);

你应该指出其中的一些(除了那些无论如何都会衰变成指针的那些):

fscanf(imptr,"\n%d %d %s %s %s %s %d %s %s", &(go->kayitno), &(go->km), go->marka, go->model, go->paket, go->renk, &(go->yil), go->motor, go->sanz);

您还应该将return语句添加到ifaktar()的else分支。

要验证scanf()操作是否成功,请将返回值添加到调试输出中。阅读关于返回值含义的规范,它会告诉你扫描的成功程度。

然后你会发现在一行中扫描几个字符串很棘手 更改为不同的阅读功能以解决该问题 使用fgets()获取整行,然后使用例如解析行strtok()应该是一个有效的概念。

当您成功地分别扫描字符串时,您会注意到扫描例如“Ízel\ Desktop \ otm-final \ otm-final.exe”成为一个15个成员的char数组注定会导致写入超出目标变量,从而导致未定义的行为。如果可以定义最大长度,请相应地增加数组大小。如果您无法定义最大长度,则会出现一个全新的问题,即读取未知长度的文本。请参阅其他问题。

然后在不同的抽象层面上存在问题,pgngp在评论中已经提到过。引用(如果有价值的评论丢失了......):

  

看起来链接列表无法正确创建,因为go的上一个节点未指向go。

解决方法可能涉及使用指向指针。

所有这些只是让你可以看到你的代码中有几个隐藏不同的陷阱。我列举了一些,表明你的根本原因有多复杂。我建议退一步。

这个有趣的文字你可能会发现问题的实际答案:
https://ericlippert.com/2014/03/21/find-a-simpler-problem/
请理解,这并不意味着“放弃”或任何其他不礼貌。这是一种在有效和可测试的东西的基础上返回代码的方法。然后你可以再次开始向你的目标递增。

答案 1 :(得分:0)

好的,我更改了函数元素嵌入main,

        FILE *fptr = fopen("Yenikayit.txt","r");
        struct arac *go = root;
        //yazdirall(root);
        while(!feof(fptr))
        {
                go=(arac*)malloc(sizeof(arac));
                go->next=NULL;
                fscanf(fptr,"\n%d %d %s %s %s %s %d %s %s", &(go->kayitno), &(go->km), go->marka, go->model, go->paket, go->renk, &(go->yil), go->motor, go->sanz);
                printf("%d %d %s %s %s %s %d %s\n",go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);
                go=go->next;
        }

在while循环中使用printf进行调试时,没关系。打印正确的值以从文本输出。

但是当从root尝试时,我会得到奇怪的输出;

    printf("%d %d %s %s %s %s %d %s\n",root->kayitno, root->km, root->marka, root->model, root->paket, root->renk, root->yil, root->motor, root->sanz);