C语言文件读取和写入(简单练习)

练习一

Q:从score.txt中读取学生成绩,将成绩分类,把结果输出到result.txt文件中

step1:读取文件

 FILE* file = fopen(file_name, "r");

step2:对文件内容进行划分,此处一个小技巧,score除以10的值结果是这个score所属区间的索引

//计算每个阶段的人数 
int score;
while (fscanf(file, "%d", &score) != EOF) {
    int score_segment = score / 10;
    score_counts[score_segment]++;
}

//计算百分比
float percentages[10] = {0.0};  // 百分比数组,初始化为0.0
  for (int i = 0; i < 10; i++) {
  percentages[i] = score_counts[i] * 100.0 / total_students;
}
    

step3:写入文件

 for (int i = 0; i < 10; i++) {
        fprintf(output_file, "%d-%d: %.2f%%\n", i * 10, i * 10 + 10, percentages[i]);
    }

完整代码:

#include <stdio.h>

void checkScore(const char* file_name) {
    FILE* file = fopen(file_name, "r");
    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }
    
    int score_counts[10] = {0};  // 分数段统计数组,初始化为0
    
    // 统计每个分数段的人数
    int score;
    while (fscanf(file, "%d", &score) != EOF) {
        int score_segment = score / 10;
        score_counts[score_segment]++;
    }
    
    fclose(file);
    
    int total_students = 0;
    for (int i = 0; i < 10; i++) {
        total_students += score_counts[i];
    }
    
    // 计算每个分数段的百分比
    float percentages[10] = {0.0};  // 百分比数组,初始化为0.0
    for (int i = 0; i < 10; i++) {
        percentages[i] = score_counts[i] * 100.0 / total_students;
    }
    
    // 将结果输出到文件
    FILE* output_file = fopen("sjfx.txt", "w");
    if (output_file == NULL) {
        printf("无法打开输出文件\n");
        return;
    }
    
    for (int i = 0; i < 10; i++) {
        fprintf(output_file, "%d-%d: %.2f%%\n", i * 10, i * 10 + 10, percentages[i]);
    }
    
    fclose(output_file);

	printf("写入文件成功!");
}

int main() {
    checkScore("score.txt");
    return 0;
}

练习二

Q:复制文本文件内容到新的文件

step1:读取

FILE* file_input = fopen("employee.txt", "r");

step2:创建新文件

FILE* file_output = fopen("employ.bak", "w");

step3:存入buffter数组,使用fputs放入新文件

 char buffer[256];
    while (fgets(buffer, sizeof(buffer), file_input) != NULL) {
        fputs(buffer, file_output);
    }

完整代码:

#include <stdio.h>

int main() {
    // 以只读方式打开employee.txt文件
    FILE* file_input = fopen("employee.txt", "r");
    if (file_input == NULL) {
        printf("无法打开输入文件employee.txt\n");
        return 1;
    }

    // 以写入方式打开employ.bak文件
    FILE* file_output = fopen("employ.bak", "w");
    if (file_output == NULL) {
        printf("无法打开输出文件employ.bak\n");
        fclose(file_input);
        return 1;
    }

    // 循环读取每一行信息,并写入employ.bak文件
    char buffer[256];
    while (fgets(buffer, sizeof(buffer), file_input) != NULL) {
        fputs(buffer, file_output);
    }

    // 关闭文件
    fclose(file_input);
    fclose(file_output);

    printf("员工信息复制完成。\n");

    return 0;
}

练习三

Q:用程序创建二进制文件xxx.dat,用命令行写入数据进文件,再读取文件内容放入数组并计算,在命令行输出结果

step1:创建文件

file = fopen("grades.dat", "wb");

step2:写入数据

使用fwrite写入数据

for (int i = 0; i < NUM_STUDENTS; i++) {
        printf("学生 %d 的成绩:\n", i + 1);
        for (int j = 0; j < NUM_SUBJECTS; j++) {
            scanf("%lf", &students[i].grades[j]);
            fwrite(&students[i].grades[j], sizeof(double), 1, file);
        }
    }

step3:读取文件

file = fopen("grades.dat", "rb");

step4:处理数据

for (int i = 0; i < NUM_STUDENTS; i++) {
        double sum = 0.0;
        for (int j = 0; j < NUM_SUBJECTS; j++) {
            fread(&grade[i][j], sizeof(double), 1, file);
            sum += grade[i][j];
        }
        double average = sum / NUM_SUBJECTS;
        printf("学生 %d 的平均成绩: %.2lf\n", i + 1, average);
    }

完整代码:

#include <stdio.h>

#define NUM_STUDENTS 3
#define NUM_SUBJECTS 4

struct StudentGrade {
    double grades[NUM_SUBJECTS];
};

int main() {
    FILE *file;
    struct StudentGrade students[NUM_STUDENTS];
    file = fopen("grades.dat", "wb");
    if (file == NULL) {
        printf("无法创建文件 grades.dat\n");
        return 1;
    }

    printf("请输入学生的成绩:\n");

    for (int i = 0; i < NUM_STUDENTS; i++) {
        printf("学生 %d 的成绩:\n", i + 1);
        for (int j = 0; j < NUM_SUBJECTS; j++) {
            scanf("%lf", &students[i].grades[j]);
            fwrite(&students[i].grades[j], sizeof(double), 1, file);
        }
    }

    fclose(file);

    file = fopen("grades.dat", "rb");

    if (file == NULL) {
        printf("无法打开文件 grades.dat\n");
        return 1;
    }

    double grade[NUM_STUDENTS][NUM_SUBJECTS];

    for (int i = 0; i < NUM_STUDENTS; i++) {
        double sum = 0.0;
        for (int j = 0; j < NUM_SUBJECTS; j++) {
            fread(&grade[i][j], sizeof(double), 1, file);
            sum += grade[i][j];
        }
        double average = sum / NUM_SUBJECTS;
        printf("学生 %d 的平均成绩: %.2lf\n", i + 1, average);
    }

    fclose(file);

    return 0;
}

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 学习 C 语言文件操作的最佳方式是首先通过学习书籍和在线教程来获取基本知识,然后练习一些基本的示例程序,以加深理解。另外,你还可以尝试自己编写一些程序,并尝试使用 C 语言的文件操作功能来完成不同的任务。 ### 回答2: 要练习C语言文件操作,可以按照以下步骤进行: 1. 理解文件操作的基本概念:了解C语言中的文件操作函数和相关的数据类型,例如文件指针、文件打开模式等。 2. 编写简单文件读写程序:从文件读取数据并打印出来,或者将一些数据写入文件中。这样的练习可以帮助你熟悉文件读写的操作流程和相关函数的使用。 3. 打开、创建和关闭文件练习使用fopen()函数打开或创建文件,并使用fclose()函数关闭文件。可以尝试使用不同的文件打开模式,例如读取模式("r")和写入模式("w")。 4. 读取写入不同类型的数据:尝试使用不同的文件操作函数,如fscanf()和fprintf(),来读取写入不同类型的数据,如整数、浮点数和字符串。 5. 文件定位和指针操作:了解和练习使用fseek()函数和ftell()函数进行文件定位操作,以及使用fgetc()和fputc()等函数进行文件指针的移动和操作。 6. 错误处理和异常情况处理:尝试使用feof()和ferror()等函数检测文件结尾和错误状态,并处理可能的异常情况,以保证程序的稳定性与安全性。 7. 练习使用文件系统相关的函数和库:例如使用<dirent.h>库中的函数来遍历目录,或者使用其他文件操作相关的函数,如rename()和remove()等。 在练习过程中,可以配合查阅C语言文件操作函数的相关文档和教程,加深对文件操作的理解和熟练度。同时,多进行实践和实际应用,将文件操作与其他C语言知识结合起来,例如结构体、指针等,提高实际编程能力和解决问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FishBBB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值