0

我创建了一个结构,它有它的 id 号、它的值和它的状态。我有一个由数据组成的文件(1 199 0 2 199 1...)1 它的数字,199 是值,0 是状态并继续这样......我使用了 1 个名为 filldata( ) 一次读取 3 个数字,例如 1 199 0,然后将其放入结构数组的传递元素中。然后,我使用另一个函数调用 this 函数来填充结构数组。fillAll 函数会将已从文件复制到结构数组的数据集返回但我收到了分段错误。知道为什么吗?代码解释得更好:

int filldata(struct Data_point *a, const char *filelocation)  
    {

        FILE *f;
        if((f=fopen(filelocation,"r"))==NULL)
            printf("You cannot open");

        if( fscanf(f, "%ld%lf%d", &(a->sampleNumber), &(a->value), &(a->status)) == 3)
            return 1;   
        else
            return 0;
    }

    int fillAll(struct Data_point *a, const char *filelocation)// I will pass the struct array and the location of my file string
    {
        int index=0;
        while(filldata(&a[index], filelocation))
            index++;

        return index;
    }
4

2 回答 2

2

您反复打开文件名filelocation但从不关闭文件句柄f。您将一遍又一遍地阅读第一行并最终用完文件句柄。

您可以更改填充数据以获取文件指针检查下面的片段我添加了一些额外的检查,您还需要size of Data_point *a在填充时检查分配范围内

int filldata(struct Data_point *a, File *f) 


    if( fscanf(f, "%ld%lf%d", &(a->sampleNumber), &(a->value), &(a->status)) == 3)
        return 1;   
    else
        return 0;
}

int fillAll(struct Data_point *a, const int data_point_size,const char *filelocation)// I will pass the struct array and the location of my file string
{

    FILE *f;
    if((f=fopen(filelocation,"r"))==NULL) {
        printf("You cannot open");
       return 0;
    }


    int index=0;
    while(index < data_point_size &&  filldata(&a[index]))  {
        index++;
    } 
    fclose(f);
    return (index != data_point_size);
 }
于 2012-04-13T19:12:58.173 回答
0

由于您的 while 循环,您遇到了分段错误。在填充数据返回 0 之前,它永远不会停止。在此之前,您的程序在传递 &a[index] 时已经越过了数组边界。另外,我相信无法保证 filldata 会在发生这种情况时返回 0,因为程序将首先尝试访问 fscanf() 中的超出范围的内存,从而导致运行时错误或获取垃圾值并将其视为成功。

如果我错了,请纠正我。

于 2012-04-13T19:22:13.510 回答