使用fscanf()读取格式化文本文件输出异常,请求错误排查
问题分析与修正方案
核心错误点及解决方法
1. fscanf读取薪资时参数错误
fscanf(pointer_,"%f", salary); 未传入salary的地址,fscanf需要变量指针来存储读取值,直接传变量值会被当作内存地址使用,导致内存越界,出现乱码或零值。
修正:改为 fscanf(pointer_, "%f", &salary);
2. fscanf与fgets混合使用的换行符问题
用fscanf("%d", &code)读取编号后,输入流中残留换行符,fgets会直接读取该换行符作为姓名内容,导致name为空行,后续age、salary读取完全错位,输出格式混乱。
修正方案:
- 方案一:读取code后用
getchar()吃掉换行符:fscanf(pointer_, "%d", &code); getchar(); // 读取并丢弃换行符 fgets(name, 35, pointer_); - 方案二:若姓名不含空格,统一用fscanf读取:
若姓名含空格,优先用方案一,或在文件中用双引号包裹姓名,再通过fscanf(pointer_, "%s", name);fscanf("%[^\"]", name)读取(需额外处理引号)。
3. 文件打开失败后未终止程序
fopen返回NULL时,程序仅打印错误信息却继续执行后续代码,会对空指针进行操作,触发未定义行为。
修正:打印错误后调用exit(1)终止程序:
if ((pointer_ = fopen("Formated.txt", "r")) == NULL) { printf("File cannot be opened or is corrupted.\n"); exit(1); }
4. main函数返回值不符合标准
标准C中main函数应返回int类型,void main是非标准写法,部分编译器会报错或出现异常。
修正:改为int main(void),并在末尾添加return 0;。
5. 无用的头文件
#include <conio.h> 是非标准头文件,且代码未使用相关函数,建议移除以提升兼容性。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { int code; char name[35]; int age; float salary; FILE *pointer_; if ((pointer_ = fopen("Formated.txt", "r")) == NULL) { printf("File cannot be opened or is corrupted.\n"); exit(1); } while (fscanf(pointer_, "%d", &code) != EOF) { getchar(); // 吃掉code后的换行符 fgets(name, 35, pointer_); // 移除fgets读取的末尾换行符,避免输出时多空行 name[strcspn(name, "\n")] = '\0'; fscanf(pointer_, "%d", &age); fscanf(pointer_, "%f", &salary); printf("%-5d %-35s %-2d %-7.2f\n", code, name, age, salary); } fclose(pointer_); return 0; }
额外说明
确保Formated.txt的格式与读取逻辑匹配,示例格式如下:
1001 张三 25 5000.00 1002 李四 30 6500.00
若文件为一行包含所有字段(如1001 张三 25 5000.00),则应统一用fscanf读取,避免混合使用fgets。
内容的提问来源于stack exchange,提问作者0x0040Coder
相关产品推荐
相关产品推荐

