C 将数据从文件存储到结构数组

C 将数据从文件存储到结构数组,c,pointers,struct,C,Pointers,Struct,在过去的两天里,我花了很多时间,但我坚持了下来。我无法理解指针和结构如何与函数一起工作 我通过引用传递struct类型的数组,并解析文件以存储值。我使用printf查看它是否使用word,但返回到主要值是错误的。我想知道我是否必须使用指针对指针来让它工作 下面是函数 int parse_sightings(char *file, struct sightings_data *recs) { FILE *fptr; char buf[50]; int lines=0;

在过去的两天里,我花了很多时间,但我坚持了下来。我无法理解指针和结构如何与函数一起工作

我通过引用传递struct类型的数组,并解析文件以存储值。我使用printf查看它是否使用word,但返回到主要值是错误的。我想知道我是否必须使用指针对指针来让它工作

下面是函数

int parse_sightings(char *file, struct sightings_data *recs) {
    FILE *fptr;
    char buf[50];
    int lines=0;

    fptr = fopen(file, "r");
    if (fptr == NULL) {
        ferror(fptr);
        exit(1);
    } else {

        while (!feof(fptr)) {
            char ch = fgetc(fptr);
            if (ch == '\n') {
                lines++;
            }
        }
        printf("%d\n",lines);
    rewind(fptr);
    recs = malloc(lines * sizeof (struct sightings_data));
    int index = 0;
    ///aber/dap/cetaceans/data/sightings_1.txt
    while (!feof(fptr)) {
        fscanf(fptr, "%s %c %lf %lf", &(recs + index)->id, &(recs + index)->type, &(recs + index)->lat, &(recs + index)->lon);
        index++;

    }
}
    fclose(fptr);
int x;

for (x = 0; x < lines; x++) {
    printf("%s %c %.2f %.2f\n", (recs + x)->id, (recs + x)->type, (recs + x)->lat, (recs + x)->lon);
}
return lines;
}
lines_sights=parse_sightings(file_2,&sight_recs);
下面是函数

int parse_sightings(char *file, struct sightings_data *recs) {
    FILE *fptr;
    char buf[50];
    int lines=0;

    fptr = fopen(file, "r");
    if (fptr == NULL) {
        ferror(fptr);
        exit(1);
    } else {

        while (!feof(fptr)) {
            char ch = fgetc(fptr);
            if (ch == '\n') {
                lines++;
            }
        }
        printf("%d\n",lines);
    rewind(fptr);
    recs = malloc(lines * sizeof (struct sightings_data));
    int index = 0;
    ///aber/dap/cetaceans/data/sightings_1.txt
    while (!feof(fptr)) {
        fscanf(fptr, "%s %c %lf %lf", &(recs + index)->id, &(recs + index)->type, &(recs + index)->lat, &(recs + index)->lon);
        index++;

    }
}
    fclose(fptr);
int x;

for (x = 0; x < lines; x++) {
    printf("%s %c %.2f %.2f\n", (recs + x)->id, (recs + x)->type, (recs + x)->lat, (recs + x)->lon);
}
return lines;
}
lines_sights=parse_sightings(file_2,&sight_recs);
最后是一个用于检查数组的

for(i=0;i<lines_sights;i++){
    printf("%s %c %.2f %.2f\n", (sight_recs + i)->id, (sight_recs + i)->type, (sight_recs + i)->lat, (sight_recs + i)->lon);
}
我找不到任何帮助,也找不到任何好的例子来说明这一点。最基本的是基本的,思考之后变得混乱。调试器通知我lat、type、lon和id超出范围。但是,第一个for如何打印数据呢

我想知道我做错了什么,对于这个和任何好的资源来说,什么是最好的方法来了解关于内存中结构的更多信息,它如何分配它,它如何解析它等等

我不能理解关于费奥夫的问题。倒带返回指针 到文件的开头。正当那么为什么feof不能表示 文件结束

feof可以指示文件的结尾,但只有在遇到文件的结尾之后,也就是说,在尝试读取文件的结尾之后。那么,你的循环

    while (!feof(fptr)) {
        fscanf(fptr, "%s %c %lf %lf", &(recs + index)->id, &(recs + index)->type, &(recs + index)->lat, &(recs + index)->lon);
        index++;
        // Try printf("index = %d\n", index); here!
    }

在读取最后一行的数据之后,will还没有进入文件的末尾,并将再次迭代循环。这在这里可能不是问题,但如果不了解其含义,使用feof可能会导致错误。

1 ferrorfptr;令人不快的而且没有任何意义。结构观测数据观测记录[];->结构观测数据*观测记录,int-parse\u-sightingschar*文件,struct-sightings\u-data*记录{->int-parse\u-sightingschar*文件,struct-sightings\u-data**记录{…*recs=malloclines*sizeof struct sightings_data;同上。使用perror代替ferror,它打印封闭的字符串,以及errno和strerror to stderrferror的结果,只检查文件访问是否有错误1。代码传递给它一个空指针,因此它没有要测试的文件访问权限。ferror只返回一个布尔值to指示是否必须向上一次文件访问传递有效的文件指针是否有错误。这不会告诉用户fopen出现了什么问题。user3629249我无法理解关于feof的问题。Rewind将指针返回到文件的开头。对吗?为什么feof不能指示文件的结尾?