C语言中写入文件后读取结构体float类型字段得到0值的问题求助
问题分析与解决方案
首先咱们来定位问题:你输入salaryRate后立刻打印是正确的,但写入文件再读出来就变成0.0,说明问题出在文件写入/读取的模式不匹配,或者读取代码的逻辑上。
核心原因:文本模式破坏二进制数据
你的结构体包含float这类二进制类型的数据,如果用文本模式(比如"w"、"r")打开文件,系统会自动处理换行符等字符转换,这会直接破坏float的二进制字节结构,导致读取后值出错。而字符串和int刚好没被这种转换影响,所以其他字段能正常显示。
解决步骤
1. 切换为二进制模式读写文件
写入和读取时都必须使用二进制模式,避免系统对二进制数据做不必要的转换:
- 写入时打开方式改为
"wb"(write binary) - 读取时打开方式改为
"rb"(read binary)
示例写入代码:
FILE *fp = fopen("employees.dat", "wb"); if(fp == NULL) { perror("Failed to open file for writing"); return 1; } // 输入数据后执行写入 fwrite(&emp, sizeof(emp), 1, fp); fclose(fp); // 记得关闭文件,确保数据写入磁盘
对应的读取代码:
FILE *fp = fopen("employees.dat", "rb"); if(fp == NULL) { perror("Failed to open file for reading"); return 1; } // 读取结构体并检查是否成功 size_t read_result = fread(&emp, sizeof(emp), 1, fp); if(read_result != 1) { printf("Failed to read employee data\n"); } else { // 注意你之前的打印顺序写错了,这里修正过来 printf("Employee Code: %s\n",emp.employeeCode); printf("Employee Name: %s\n",emp.employeename); printf("Salary Level: %d\n",emp.salaryLevel); printf("Salary Rate: $ %.2f/day\n", emp.salaryRate); } fclose(fp);
2. 确保读取代码的正确性
你没贴读取的代码,一定要用fread读取整个结构体,并且检查返回值。如果读取失败(比如文件损坏、读取字节数不足),salaryRate会保留变量的初始值0.0。
额外提示:别用fflush(stdin)
fflush(stdin)是C标准未定义的行为(标准只允许fflush作用于输出流),虽然部分编译器支持,但移植性极差。清理输入缓冲区可以用下面的代码替代:
// 清理缓冲区中剩余的换行符和垃圾字符 int c; while((c = getchar()) != '\n' && c != EOF);
比如在读取employeeCode后替换fflush(stdin):
printf("Enter the Employee Code:\n"); scanf("%s",emp.employeeCode); // 清理缓冲区 int c; while((c = getchar()) != '\n' && c != EOF); printf("Enter the Employee Name\n"); scanf ("%[^\n]%*c", emp.employeename);
按照上面的修改,salaryRate应该就能正常读取显示了。
内容的提问来源于stack exchange,提问作者Niic
相关产品推荐
相关产品推荐

