将数据从文件存储到struct数组

时间:2014-12-02 01:21:50

标签: c pointers struct

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

我通过引用传递一个struct类型的数组,并解析一个文件来存储值。我使用printf看到它确实是单词,但主要是返回值,这是错误的。我想知道是否必须使用指针指针使其工作。

这是函数

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

printf提供正确的输出。问题在主要的

中出现

主要: 我在这里声明了结构

struct sightings_data sight_recs[];

这是函数

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超出范围。但那么第一个如何打印数据呢?

我想知道我做错了什么,最好的方法是什么以及任何好的资源来学习更多关于内存中的结构,如何分配它,如何解析它等等。

1 个答案:

答案 0 :(得分:0)

  

我无法理解feof()的问题。 Rewind()返回指针   到文件的开头。对?那为什么然后不能表明   文件结束?

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!
    }
在读完最后一行的数据之后,

还没有碰到文件结尾,并且会再次循环循环。这可能不是问题,但如果没有人意识到这些含义,feof()的这种用法可能会导致错误。