【发布时间】: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 不能指示文件结束呢?