C语言文件处理:实数四舍五入与文件I/O实践

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语言中文件操作的基本模式:

  1. 使用fopen()函数打开文件,第一个参数是文件名,第二个参数是打开模式
  2. "r"表示以只读方式打开,"w"表示以写入方式打开(如果文件存在则清空)
  3. 必须检查文件指针是否为NULL,这是判断文件是否成功打开的关键
  4. 如果打开失败,打印错误信息并使用exit(0)终止程序

注意:在实际项目中,建议使用更详细的错误信息,比如使用perror()函数输出系统错误信息,或者将错误信息写入日志文件。

2.2 数据读取与处理

c复制while(fscanf(fp1,"%lf",&num)==1){
    integer_num=(int)round(num);
    fprintf(fp2,"%d ",integer_num);
}

这是程序的核心处理逻辑:

  1. 使用fscanf()从输入文件中读取一个双精度浮点数
  2. fscanf()的返回值表示成功读取的项目数,这里判断是否等于1可以确保正确读取
  3. 使用round()函数对浮点数进行四舍五入
  4. 将结果强制转换为int类型
  5. 使用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);
}

文件关闭同样需要错误检查:

  1. fclose()返回0表示成功,非0表示失败
  2. 虽然文件关闭失败的情况较少见,但良好的编程习惯应该包含这种检查
  3. 关闭文件失败可能导致数据丢失或资源泄漏

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;
}

改进点包括:

  1. 使用perror()输出更详细的错误信息
  2. 添加了处理数字的计数功能
  3. 使用EXIT_FAILURE代替0作为错误退出码
  4. 在打开输出文件失败时,先关闭已打开的

内容推荐

已经到底了哦
已经到底了哦