fscanf无法读取文件内容,请求技术排查与解决
嘿,我帮你找出代码里的几个核心问题,这就是你读取数据失败的原因啦:
1. 指针
q越界访问,返回了错误的指针 你初始化q = p后,在循环里每次执行q++,当循环结束时,q已经跑到了动态分配数组末尾的下一个位置(属于超出数组范围的无效内存)。这时候你用q[0]、q[1]、q[2]去访问,属于数组越界访问,是C语言里的未定义行为,打印出来的内容自然是无意义的“空”或者乱码。
更糟的是,你最后返回的是q,调用者拿到的会是一个指向无效内存的野指针,根本没法正确使用数组里的数据。
2. 验证读取结果时用错了指针
要确认数据是否读取成功,你应该用数组的起始指针p来访问元素,而不是已经偏移到末尾的q。比如把打印语句改成:
printf("%f - %f - %f", p[0], p[1], p[2]);
3. 额外的潜在问题排查点
- 文件路径是否正确:如果你的程序和目标TXT文件不在同一目录,
fopen会进入错误分支打印提示;如果路径没问题,那核心问题还是指针偏移。 - 检查
fscanf的返回值:建议每次调用fscanf后判断返回值是否等于预期读取的变量数量,这样能精准排查是否真的读取到了数据。比如第一次读取可以改成:
if (fscanf(f," %d %f",nMoedas,valor) != 2) { printf("读取nMoedas和valor失败\n"); fclose(f); exit(1); }
修正后的完整代码示例
我把指针的问题修复,同时加上了读取失败的校验逻辑:
float * le_dados_ficheiro(char *nomeFich,int *nMoedas, float *valor) { FILE *f; float *p,*q; int i; f = fopen(nomeFich,"r"); if(!f) { printf("Erro ao abrir ficheiro %s\n",nomeFich); exit(1); } // 校验nMoedas和valor的读取结果 if (fscanf(f," %d %f",nMoedas,valor) != 2) { printf("Falha ao ler nMoedas e valor\n"); fclose(f); exit(1); } p = malloc(sizeof(float)*(*nMoedas)); if(!p) { printf("Erro ao reservar memoria ... \n"); exit(1); } q = p; for(i = 0; i < *nMoedas; i++) { // 校验每个浮点数的读取 if (fscanf(f," %f",q++) != 1) { printf("Falha ao ler a moeda %d\n", i); free(p); // 释放已分配的内存,避免内存泄漏 fclose(f); exit(1); } } fclose(f); // 使用数组起始指针p打印读取到的数据 printf("%f - %f - %f", p[0], p[1], p[2]); // 返回数组的起始地址p,供调用者使用 return p; }
内容的提问来源于stack exchange,提问作者Kelve
相关产品推荐
相关产品推荐

