编写一个班级学生成绩管理的代码,要有文件的创建、文件的复制、文件的删除;可以输入班级成绩,保存文件,利用磁盘文件对学生成绩进行管理,包括查询成绩、修改成绩、显示所有学生成绩;可以实现将一个班级成绩文件复制到另一个文件的功能。学习使用文件控制,实现指定班级成绩文件的删除操作。实现目录的管理,创建与删除子目录、搜索指定的文件。
时间: 2024-03-18 10:43:51 浏览: 31
好的,以下是一个简单的班级学生成绩管理的代码示例,包含了文件的创建、文件的复制、文件的删除等功能。代码中使用了文件控制和目录管理相关的函数,如fopen、fclose、fscanf、fprintf、remove、rename等。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#define MAX_STUDENTS 100 // 最大学生数
#define MAX_NAME_LEN 20 // 姓名最大长度
#define MAX_FILENAME_LEN 50 // 文件名最大长度
typedef struct {
char name[MAX_NAME_LEN]; // 姓名
int score; // 成绩
} Student;
// 文件路径处理函数,返回文件完整路径
char *get_file_path(char *filename) {
static char filepath[MAX_FILENAME_LEN];
strcpy(filepath, "./data/");
strcat(filepath, filename);
return filepath;
}
// 创建新文件
void create_file(char *filename) {
FILE *fp = fopen(get_file_path(filename), "w");
if (fp == NULL) {
printf("无法创建文件\n");
exit(1);
}
printf("已成功创建文件 %s\n", filename);
fclose(fp);
}
// 复制文件
void copy_file(char *src_filename, char *dst_filename) {
FILE *src_fp = fopen(get_file_path(src_filename), "r");
if (src_fp == NULL) {
printf("无法打开文件 %s\n", src_filename);
exit(1);
}
FILE *dst_fp = fopen(get_file_path(dst_filename), "w");
if (dst_fp == NULL) {
printf("无法创建文件 %s\n", dst_filename);
fclose(src_fp);
exit(1);
}
char ch;
while ((ch = fgetc(src_fp)) != EOF) {
fputc(ch, dst_fp);
}
printf("已成功将文件 %s 复制到 %s\n", src_filename, dst_filename);
fclose(src_fp);
fclose(dst_fp);
}
// 删除文件
void delete_file(char *filename) {
int ret = remove(get_file_path(filename));
if (ret == 0) {
printf("已成功删除文件 %s\n", filename);
} else {
printf("无法删除文件 %s\n", filename);
}
}
// 显示所有学生成绩
void show_all_scores(char *filename) {
FILE *fp = fopen(get_file_path(filename), "r");
if (fp == NULL) {
printf("无法打开文件 %s\n", filename);
exit(1);
}
printf("学生姓名\t成绩\n");
printf("----------------------\n");
Student students[MAX_STUDENTS];
int count = 0;
while (fscanf(fp, "%s %d", students[count].name, &students[count].score) != EOF) {
printf("%-10s\t%d\n", students[count].name, students[count].score);
count++;
}
if (count == 0) {
printf("无数据\n");
}
fclose(fp);
}
// 修改学生成绩
void modify_score(char *filename, char *name, int new_score) {
FILE *fp = fopen(get_file_path(filename), "r+");
if (fp == NULL) {
printf("无法打开文件 %s\n", filename);
exit(1);
}
Student student;
int found = 0;
while (fscanf(fp, "%s %d", student.name, &student.score) != EOF) {
if (strcmp(student.name, name) == 0) {
fseek(fp, -sizeof(int), SEEK_CUR);
fprintf(fp, "%d", new_score);
found = 1;
break;
}
}
if (found) {
printf("已成功将 %s 的成绩修改为 %d\n", name, new_score);
} else {
printf("找不到姓名为 %s 的学生\n", name);
}
fclose(fp);
}
// 搜索指定文件
void search_file(char *dir_path, char *filename) {
DIR *dir = opendir(dir_path);
if (dir == NULL) {
printf("无法打开目录 %s\n", dir_path);
exit(1);
}
struct dirent *entry;
int found = 0;
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, filename) == 0) {
printf("已在目录 %s 中找到文件 %s\n", dir_path, filename);
found = 1;
break;
}
}
if (!found) {
printf("在目录 %s 中找不到文件 %s\n", dir_path, filename);
}
closedir(dir);
}
int main() {
// 创建文件夹
int ret = mkdir("./data", 0777);
if (ret == -1) {
printf("无法创建文件夹\n");
exit(1);
}
printf("已成功创建文件夹 data\n");
// 创建新文件
create_file("class1.txt");
// 输入学生成绩
FILE *fp = fopen(get_file_path("class1.txt"), "w");
if (fp == NULL) {
printf("无法打开文件\n");
exit(1);
}
printf("请输入学生成绩(格式:姓名 成绩,输入-1结束):\n");
char name[MAX_NAME_LEN];
int score;
while (1) {
scanf("%s %d", name, &score);
if (score == -1) {
break;
}
fprintf(fp, "%s %d\n", name, score);
}
fclose(fp);
// 显示所有学生成绩
show_all_scores("class1.txt");
// 修改学生成绩
modify_score("class1.txt", "张三", 90);
show_all_scores("class1.txt");
// 复制文件
copy_file("class1.txt", "class1_copy.txt");
// 删除文件
delete_file("class1_copy.txt");
// 搜索指定文件
search_file(".", "main.c");
// 删除文件夹及其内容
ret = system("rm -rf ./data");
if (ret == -1) {
printf("无法删除文件夹\n");
exit(1);
}
printf("已成功删除文件夹 data\n");
return 0;
}
```
以上代码只是一个简单的示例,实际使用时可能需要根据具体需求进行修改和完善。