【问题标题】:store data from a file to a struct array将数据从文件存储到结构数组
【发布时间】:2014-12-02 01:21:49
【问题描述】:

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

我通过引用传递一个 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 给出正确的输出。该问题主要诉诸于for in main

主要内容: 我在这里声明结构

struct sightings_data sight_recs[];

这里是函数

lines_sights=parse_sightings(file_2,&sight_recs);

最后是一个用于检查数组的 for

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 是如何打印数据的呢?

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

【问题讨论】:

  • 1) ferror(fptr); 糟糕!而且没有任何意义。
  • struct sightings_data sight_recs[]; --> struct sightings_data *sight_recs; , int parse_sightings(char *file, struct sightings_data *recs) { --> int parse_sightings(char *file, struct sightings_data **recs) { ... *recs = malloc(lines * sizeof (struct sightings_data)); 同上。
  • 而不是 ferror(),使用 perror() 将包含的字符串以及 errno 和 strerror() 的结果打印到 stderr
  • ferror 仅检查文件访问是否有错误 1) 代码将空指针传递给它,因此没有文件访问可供它测试。 ferror 只返回一个布尔值来指示最后一次文件访问(必须传递一个有效的文件指针)是否有错误。这不会告诉用户 fopen 出了什么问题。
  • user3629249 我无法理解 feof() 的问题。 Rewind() 返回指向文件开头的指针。对?那么为什么 feof 不能指示文件结束呢?

标签: c pointers struct


【解决方案1】:

我无法理解 feof() 的问题。 Rewind() 返回指针 到文件的开头。对?为什么然后 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!
    }

将在读取最后一行的数据后,还没有碰到文件末尾,并且会再循环一次。这在这里可能不是问题,但如果不了解其中的含义,feof() 的这种用法可能会导致错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多