过去两天我花了很多时间,但我坚持了下来。我无法理解指针和结构如何与函数一起使用。
我通过引用传递一个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超出范围。但那么第一个如何打印数据呢?
我想知道我做错了什么,最好的方法是什么以及任何好的资源来学习更多关于内存中的结构,如何分配它,如何解析它等等。
答案 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()
的这种用法可能会导致错误。