void delete_student() { char id[MAX_ID_LEN]; printf("请输入要删除的学生学号:"); scanf("%s", id); getchar(); // 把换行符读掉 FILE *fp = fopen("students.dat", "r"); FILE *fp_tmp = fopen("students.tmp", "w"); char line[MAX_LINE_LEN]; int deleted = 0; while (fgets(line, sizeof(line), fp)) { char tmp_id[MAX_ID_LEN]; sscanf(line+MAX_NAME_LEN*2+MAX_CLASS_LEN+3, "%s", tmp_id); if (strcmp(tmp_id, id) == 0) { deleted = 1; continue; } fputs(line, fp_tmp); } fclose(fp); fclose(fp_tmp); if (deleted) { remove("students.dat"); rename("students.tmp", "students.dat"); printf("删除成功!\n"); } else { remove("students.tmp"); printf("找不到该学生!\n"); } }
时间: 2024-03-18 16:44:45 浏览: 21
这段代码定义了一个名为 delete_student 的函数,用于从学生信息表格中删除一条学生记录。函数首先声明了一个字符串变量 id,用于存储要删除的学生学号。函数通过 printf 函数提示用户输入要删除的学生学号,并使用 scanf 函数从标准输入读取字符串。然后,函数打开名为 "students.dat" 的文件,以只读方式读取学生信息,并打开名为 "students.tmp" 的文件,以写入方式写入非删除的学生信息。函数使用一个 while 循环,逐行读取文件中的学生信息,并使用 sscanf 函数提取每行学生信息中的学号。如果该学生学号与要删除的学生学号相同,函数将标记删除并跳过该行信息;否则,函数将该行信息写入 "students.tmp" 文件中。循环结束后,函数关闭两个文件指针。
如果成功删除了一条学生记录,函数将删除原始的 "students.dat" 文件,并将 "students.tmp" 文件重命名为 "students.dat"。如果没有找到要删除的学生记录,函数将删除 "students.tmp" 文件并输出一条错误信息。MAX_NAME_LEN、MAX_CLASS_LEN 和 MAX_ID_LEN 都是预定义的常量,分别表示姓名、班级和学号字符串的最大长度。
相关问题
请用C 编写一系统,实现学生信息管理,查询时可实现按姓名、按学号查询“
好的,我可以为您编写一个简单的学生信息管理系统,基于命令行界面,支持添加、查询和删除学生信息。以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_ID_LEN 10
#define MAX_STUDENT_NUM 100
typedef struct {
char name[MAX_NAME_LEN];
char id[MAX_ID_LEN];
int age;
char gender;
} Student;
Student students[MAX_STUDENT_NUM];
int student_num = 0;
void add_student() {
if (student_num >= MAX_STUDENT_NUM) {
printf("Error: too many students\n");
return;
}
Student new_student;
printf("Enter student name: ");
scanf("%s", new_student.name);
printf("Enter student ID: ");
scanf("%s", new_student.id);
printf("Enter student age: ");
scanf("%d", &new_student.age);
printf("Enter student gender (M/F): ");
scanf(" %c", &new_student.gender);
students[student_num] = new_student;
student_num++;
printf("Student added successfully\n");
}
void print_student(Student s) {
printf("%s, %s, %d, %c\n", s.name, s.id, s.age, s.gender);
}
void query_student() {
int mode;
printf("Select query mode (1 for name, 2 for ID): ");
scanf("%d", &mode);
if (mode == 1) {
char name[MAX_NAME_LEN];
printf("Enter student name: ");
scanf("%s", name);
int found = 0;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].name, name) == 0) {
print_student(students[i]);
found = 1;
}
}
if (!found) {
printf("No such student found\n");
}
} else if (mode == 2) {
char id[MAX_ID_LEN];
printf("Enter student ID: ");
scanf("%s", id);
int found = 0;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
print_student(students[i]);
found = 1;
}
}
if (!found) {
printf("No such student found\n");
}
} else {
printf("Invalid query mode\n");
}
}
void delete_student() {
char id[MAX_ID_LEN];
printf("Enter student ID to delete: ");
scanf("%s", id);
int found = 0;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
for (int j = i; j < student_num - 1; j++) {
students[j] = students[j + 1];
}
student_num--;
printf("Student deleted successfully\n");
found = 1;
break;
}
}
if (!found) {
printf("No such student found\n");
}
}
int main() {
int choice;
while (1) {
printf("1. Add student\n");
printf("2. Query student\n");
printf("3. Delete student\n");
printf("4. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student();
break;
case 2:
query_student();
break;
case 3:
delete_student();
break;
case 4:
exit(0);
default:
printf("Invalid choice\n");
}
}
return 0;
}
```
这个程序中,学生信息存储在一个结构体数组中,最多支持存储100个学生信息。添加学生信息时,用户需要输入学生姓名、学号、年龄和性别;查询学生信息时,用户可以选择按姓名或学号查询,系统会输出匹配的学生信息;删除学生信息时,用户需要输入学生的学号,系统会删除该学生的信息。
请给我一个要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改,其中学生信息存储在students.dat文件中,每个学生信息占据一行,每个字段用空格分隔,每个字段的最大宽度为MAX_NAME_LEN,例如姓名和名字的最大宽度为10个字符。代码中实现了插入、删除和修改学生信息的功能。
好的,我可以帮你编写这个要求。以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 10
// 定义学生信息结构体
typedef struct {
char name[MAX_NAME_LEN + 1];
char address[MAX_NAME_LEN + 1];
char student_id[MAX_NAME_LEN + 1];
} Student;
// 定义函数声明
void print_student(Student student);
void print_file_header();
void print_file_footer();
void insert_student();
void delete_student();
void modify_student();
void save_students();
// 定义全局变量
Student students[100];
int num_students = 0;
int main(void) {
FILE *fp;
char buffer[MAX_NAME_LEN + 1];
int choice, i;
// 从文件中读取学生信息
fp = fopen("students.dat", "r");
if (fp != NULL) {
while (fscanf(fp, "%s %s %s", students[num_students].name, students[num_students].address, students[num_students].student_id) == 3) {
num_students++;
}
fclose(fp);
}
// 显示菜单,进行操作
do {
printf("\n1. 插入学生信息\n2. 删除学生信息\n3. 修改学生信息\n4. 保存学生信息\n5. 退出程序\n\n请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
insert_student();
break;
case 2:
delete_student();
break;
case 3:
modify_student();
break;
case 4:
save_students();
break;
case 5:
printf("\n程序已退出。\n\n");
break;
default:
printf("\n无效的操作编号,请重新输入。\n\n");
break;
}
} while (choice != 5);
return 0;
}
// 打印学生信息
void print_student(Student student) {
printf("%-*s%-*s%-*s\n", MAX_NAME_LEN, student.name, MAX_NAME_LEN, student.address, MAX_NAME_LEN, student.student_id);
}
// 打印表头
void print_file_header() {
printf("%-*s%-*s%-*s\n", MAX_NAME_LEN, "姓名", MAX_NAME_LEN, "地址", MAX_NAME_LEN, "学号");
}
// 打印表尾
void print_file_footer() {
printf("共 %d 条记录。\n", num_students);
}
// 插入学生信息
void insert_student() {
Student student;
int i;
// 获取学生信息
printf("\n请输入学生姓名、地址和学号,用空格分隔:");
scanf("%s %s %s", student.name, student.address, student.student_id);
// 将学生信息插入到数组中
students[num_students] = student;
num_students++;
// 显示插入后的学生信息
printf("\n插入成功,插入后的学生信息如下:\n\n");
print_file_header();
for (i = 0; i < num_students; i++) {
print_student(students[i]);
}
print_file_footer();
}
// 删除学生信息
void delete_student() {
char student_id[MAX_NAME_LEN + 1];
int i, j;
// 获取要删除的学生的学号
printf("\n请输入要删除的学生的学号:");
scanf("%s", student_id);
// 在数组中查找要删除的学生,并将其从数组中删除
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].student_id, student_id) == 0) {
for (j = i; j < num_students - 1; j++) {
students[j] = students[j + 1];
}
num_students--;
printf("\n删除成功,删除后的学生信息如下:\n\n");
print_file_header();
for (j = 0; j < num_students; j++) {
print_student(students[j]);
}
print_file_footer();
return;
}
}
// 如果没有找到要删除的学生,则显示错误信息
printf("\n未找到要删除的学生。\n");
}
// 修改学生信息
void modify_student() {
char student_id[MAX_NAME_LEN + 1];
int i;
// 获取要修改的学生的学号
printf("\n请输入要修改的学生的学号:");
scanf("%s", student_id);
// 在数组中查找要修改的学生,并修改其信息
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].student_id, student_id) == 0) {
printf("\n请输入学生姓名、地址和学号,用空格分隔:");
scanf("%s %s %s", students[i].name, students[i].address, students[i].student_id);
printf("\n修改成功,修改后的学生信息如下:\n\n");
print_file_header();
print_student(students[i]);
print_file_footer();
return;
}
}
// 如果没有找到要修改的学生,则显示错误信息
printf("\n未找到要修改的学生。\n");
}
// 保存学生信息到文件中
void save_students() {
FILE *fp;
int i;
// 打开文件,如果文件不存在则创建文件
fp = fopen("students.dat", "w");
if (fp == NULL) {
printf("\n无法打开文件。\n");
return;
}
// 将学生信息写入文件中
for (i = 0; i < num_students; i++) {
fprintf(fp, "%-*s%-*s%-*s\n", MAX_NAME_LEN, students[i].name, MAX_NAME_LEN, students[i].address, MAX_NAME_LEN, students[i].student_id);
}
// 关闭文件
fclose(fp);
// 显示保存成功信息
printf("\n保存成功。\n");
}
```
这段代码实现了你的要求,可以在 C 语言的运行界面中进行插入、删除和修改学生信息的操作,并将学生信息存储在 students.dat 文件中,每个学生信息占据一行,每个字段用空格分隔,每个字段的最大宽度为 MAX_NAME_LEN,例如姓名和名字的最大宽度为 10 个字符。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)