C 将数据从文件存储到结构数组
在过去的两天里,我花了很多时间,但我坚持了下来。我无法理解指针和结构如何与函数一起工作 我通过引用传递struct类型的数组,并解析文件以存储值。我使用printf查看它是否使用word,但返回到主要值是错误的。我想知道我是否必须使用指针对指针来让它工作 下面是函数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;
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不能指示文件的结尾?