1. 项目概述
这个C语言练习项目实现了一个简单的文件处理功能:从一个文本文件中读取若干实数,对每个实数进行四舍五入取整后,将结果写入另一个文本文件。这是C语言文件操作和数学运算的典型练习,适合初学者掌握基本的文件I/O操作和数据类型转换。
在实际编程中,这种文件处理场景非常常见。比如处理传感器采集的浮点数据时需要取整存储,或者对财务数据进行四舍五入计算等。通过这个练习,可以掌握C语言中文件操作的基本流程、浮点数处理技巧以及错误处理方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心代码解析
2.1 文件打开与错误处理
c复制FILE *fp1=fopen("f1.txt","r");
if(fp1==NULL){
printf("File(f1.txt) can not open!\n");
exit(0);
}
FILE *fp2=fopen("f2.txt","w");
if(fp2==NULL){
printf("File(f2.txt) can not open!\n");
exit(0);
}
这段代码展示了C语言中文件操作的基本模式:
- 使用
fopen()函数打开文件,第一个参数是文件名,第二个参数是打开模式 - "r"表示以只读方式打开,"w"表示以写入方式打开(如果文件存在则清空)
- 必须检查文件指针是否为NULL,这是判断文件是否成功打开的关键
- 如果打开失败,打印错误信息并使用
exit(0)终止程序
注意:在实际项目中,建议使用更详细的错误信息,比如使用
perror()函数输出系统错误信息,或者将错误信息写入日志文件。
2.2 数据读取与处理
c复制while(fscanf(fp1,"%lf",&num)==1){
integer_num=(int)round(num);
fprintf(fp2,"%d ",integer_num);
}
这是程序的核心处理逻辑:
- 使用
fscanf()从输入文件中读取一个双精度浮点数 fscanf()的返回值表示成功读取的项目数,这里判断是否等于1可以确保正确读取- 使用
round()函数对浮点数进行四舍五入 - 将结果强制转换为int类型
- 使用
fprintf()将整数写入输出文件,每个数字后加一个空格
提示:
round()函数来自math.h头文件,它遵循标准的四舍五入规则,即小数部分≥0.5时向上取整,否则向下取整。
2.3 文件关闭与错误检查
c复制if(fclose(fp1)){
printf("Can not close the file(f1.txt)!\n");
exit(0);
}
if(fclose(fp2)){
printf("Can not close the file(f2.txt)!\n");
exit(0);
}
文件关闭同样需要错误检查:
fclose()返回0表示成功,非0表示失败- 虽然文件关闭失败的情况较少见,但良好的编程习惯应该包含这种检查
- 关闭文件失败可能导致数据丢失或资源泄漏
3. 完整实现与扩展
3.1 完整代码实现
基于原始代码,我们可以进一步完善,添加更多实用功能:
c复制#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main() {
double num;
int integer_num;
int count = 0;
// 打开输入文件
FILE *fp1 = fopen("f1.txt", "r");
if(fp1 == NULL) {
perror("Error opening input file");
exit(EXIT_FAILURE);
}
// 打开输出文件
FILE *fp2 = fopen("f2.txt", "w");
if(fp2 == NULL) {
perror("Error opening output file");
fclose(fp1); // 关闭已打开的文件
exit(EXIT_FAILURE);
}
// 处理数据
while(fscanf(fp1, "%lf", &num) == 1) {
integer_num = (int)round(num);
fprintf(fp2, "%d ", integer_num);
count++;
}
// 关闭文件
if(fclose(fp1)) {
perror("Error closing input file");
exit(EXIT_FAILURE);
}
if(fclose(fp2)) {
perror("Error closing output file");
exit(EXIT_FAILURE);
}
printf("Processed %d numbers successfully.\n", count);
return 0;
}
改进点包括:
- 使用
perror()输出更详细的错误信息 - 添加了处理数字的计数功能
- 使用
EXIT_FAILURE代替0作为错误退出码 - 在打开输出文件失败时,先关闭已打开的
