练习一
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;
}