如何利用结构体删除文件中的某一具体信息
时间: 2023-03-29 22:03:52 浏览: 178
可以通过以下步骤利用结构体删除文件中的某一具体信息:
1. 定义一个结构体,包含需要删除的信息以及其他信息。
2. 打开文件并读取其中的内容,将每个信息存储到结构体数组中。
3. 遍历结构体数组,找到需要删除的信息所在的结构体。
4. 将需要删除的结构体从数组中删除。
5. 将更新后的结构体数组重新写入文件中,覆盖原有内容。
需要注意的是,在删除结构体时,可以使用 memmove 函数将后面的结构体向前移动,以保证数组的连续性。同时,需要确保文件的打开方式为二进制模式,以免出现编码问题。
相关问题
用c语言写:实现一个简单的信息管理系统,具有以下功能: 1. 信息输入:可以输入信息标题、内容、作者、分类等信息,存入信息库中。要求支持多条信息输入。 2. 信息检索:可以按标题、作者、分类等信息进行检索,找到相关的信息条目输出全部信息。 3. 信息修改:可以修改已有的信息条目,修改信息包括标题、内容、作者、分类等。 4. 信息删除:可以根据标题删除已有的信息条目。 5. 信息统计:可以统计信息库中的信息总条数或者某个分类的条数。 6. 信息输出:可以输出所有信息或者某分类下所有的信息。信息以标题、内容、作者等形式整齐打印。 该信息管理系统需要具备一个统一的菜单界面,支持用户通过键入不同的选项进行各种操作。系统需要开辟相应的结构体,考虑使用数据文件等保存信息。
下面是一个简单的信息管理系统的实现,使用了结构体和文件操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TITLE_LEN 50
#define MAX_CONTENT_LEN 500
#define MAX_AUTHOR_LEN 20
#define MAX_CATEGORY_LEN 20
#define MAX_INFO_NUM 100
// 信息结构体
typedef struct {
char title[MAX_TITLE_LEN];
char content[MAX_CONTENT_LEN];
char author[MAX_AUTHOR_LEN];
char category[MAX_CATEGORY_LEN];
} Info;
// 存储所有信息的数组
Info infos[MAX_INFO_NUM];
// 信息数量
int info_count = 0;
// 显示菜单
void show_menu() {
printf("\n");
printf("1. 输入信息\n");
printf("2. 检索信息\n");
printf("3. 修改信息\n");
printf("4. 删除信息\n");
printf("5. 统计信息\n");
printf("6. 输出信息\n");
printf("0. 退出\n");
printf("\n");
}
// 输入信息
void input_info() {
printf("请输入信息标题:");
scanf("%s", infos[info_count].title);
printf("请输入信息内容:");
scanf("%s", infos[info_count].content);
printf("请输入信息作者:");
scanf("%s", infos[info_count].author);
printf("请输入信息分类:");
scanf("%s", infos[info_count].category);
info_count++;
}
// 检索信息
void search_info() {
printf("请输入检索关键字:");
char keyword[MAX_TITLE_LEN];
scanf("%s", keyword);
int found = 0;
for (int i = 0; i < info_count; i++) {
if (strstr(infos[i].title, keyword) ||
strstr(infos[i].author, keyword) ||
strstr(infos[i].category, keyword)) {
printf("%s\n", infos[i].title);
printf("%s\n", infos[i].content);
printf("作者:%s\n", infos[i].author);
printf("分类:%s\n", infos[i].category);
printf("\n");
found = 1;
}
}
if (!found) {
printf("没有找到相关的信息!\n");
}
}
// 修改信息
void modify_info() {
printf("请输入要修改的信息标题:");
char title[MAX_TITLE_LEN];
scanf("%s", title);
int found = 0;
for (int i = 0; i < info_count; i++) {
if (strcmp(infos[i].title, title) == 0) {
printf("请输入新的信息标题:");
scanf("%s", infos[i].title);
printf("请输入新的信息内容:");
scanf("%s", infos[i].content);
printf("请输入新的信息作者:");
scanf("%s", infos[i].author);
printf("请输入新的信息分类:");
scanf("%s", infos[i].category);
found = 1;
break;
}
}
if (!found) {
printf("没有找到要修改的信息!\n");
}
}
// 删除信息
void delete_info() {
printf("请输入要删除的信息标题:");
char title[MAX_TITLE_LEN];
scanf("%s", title);
int found = 0;
for (int i = 0; i < info_count; i++) {
if (strcmp(infos[i].title, title) == 0) {
for (int j = i; j < info_count - 1; j++) {
infos[j] = infos[j + 1];
}
info_count--;
found = 1;
break;
}
}
if (!found) {
printf("没有找到要删除的信息!\n");
}
}
// 统计信息
void count_info() {
printf("请输入要统计的分类(输入all统计全部信息):");
char category[MAX_CATEGORY_LEN];
scanf("%s", category);
int count = 0;
if (strcmp(category, "all") == 0) {
count = info_count;
} else {
for (int i = 0; i < info_count; i++) {
if (strcmp(infos[i].category, category) == 0) {
count++;
}
}
}
printf("共有%d条信息!\n", count);
}
// 输出信息
void output_info() {
printf("请输入要输出的分类(输入all输出全部信息):");
char category[MAX_CATEGORY_LEN];
scanf("%s", category);
for (int i = 0; i < info_count; i++) {
if (strcmp(category, "all") == 0 || strcmp(infos[i].category, category) == 0) {
printf("%s\n", infos[i].title);
printf("%s\n", infos[i].content);
printf("作者:%s\n", infos[i].author);
printf("分类:%s\n", infos[i].category);
printf("\n");
}
}
}
// 保存信息到文件
void save_info() {
FILE *fp = fopen("infos.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fprintf(fp, "%d\n", info_count);
for (int i = 0; i < info_count; i++) {
fprintf(fp, "%s\n", infos[i].title);
fprintf(fp, "%s\n", infos[i].content);
fprintf(fp, "%s\n", infos[i].author);
fprintf(fp, "%s\n", infos[i].category);
}
fclose(fp);
}
// 从文件中读取信息
void load_info() {
FILE *fp = fopen("infos.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fscanf(fp, "%d", &info_count);
for (int i = 0; i < info_count; i++) {
fscanf(fp, "%s", infos[i].title);
fscanf(fp, "%s", infos[i].content);
fscanf(fp, "%s", infos[i].author);
fscanf(fp, "%s", infos[i].category);
}
fclose(fp);
}
int main() {
load_info(); // 从文件中读取信息
int choice;
do {
show_menu();
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
input_info();
break;
case 2:
search_info();
break;
case 3:
modify_info();
break;
case 4:
delete_info();
break;
case 5:
count_info();
break;
case 6:
output_info();
break;
case 0:
save_info(); // 保存信息到文件
printf("谢谢使用!\n");
break;
default:
printf("请输入正确的选项!\n");
break;
}
} while (choice != 0);
return 0;
}
```
这个程序使用了一个 `Info` 结构体来存储信息,使用了一个 `infos` 数组来存储所有信息,使用了一个 `info_count` 变量来记录信息数量。
程序提供了菜单界面,用户可以通过键入不同的选项进行各种操作。具体实现如下:
1. 输入信息:用户可以输入信息标题、内容、作者、分类等信息,并将信息存入信息库中。要求支持多条信息输入。
2. 检索信息:用户可以按标题、作者、分类等信息进行检索,找到相关的信息条目输出全部信息。
3. 修改信息:用户可以修改已有的信息条目,修改信息包括标题、内容、作者、分类等。
4. 删除信息:用户可以根据标题删除已有的信息条目。
5. 统计信息:用户可以统计信息库中的信息总条数或者某个分类的条数。
6. 输出信息:用户可以输出所有信息或者某分类下所有的信息。信息以标题、内容、作者等形式整齐打印。
程序还使用了文件操作,将程序运行时的信息保存到一个文本文件中,程序启动时读取该文件,恢复之前的信息。
作为总复习的作业题,为了包含更多更完整的内容,也为了巩固大家的编程知识,以及动手解决实际问题的能力,使用C语言来设计一个简单的成绩管理系统。管理系统包含以下功能: 1.建立一张学生成绩表,每个学生包含 学号、姓名、性别、语文、数学、英语、总分、平均分。 2.将表中所有信息按总分降序排列。 3.按学号查找某学生所有成绩。 4.能够实现某学生的成绩插入和删除。 5.实现文件操作,程序退出时将学生成绩保存在studen_grad.txt文件中;程序开始时,能够从student_grad.txt文件中加载已有的学生成绩信息。 要求:所有功能均使用独立的函数来实现,使用结构体来存储学生信息,使用malloc动态创建,假设学生的总数是固定的(即你只需要开辟一次内存,使用一个整数n来存储学生数量,删除某学生的信息时只需要将后面所有的学生往前挪一位并将n-1)
以下是一个简单的成绩管理系统的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 假设最多有100个学生
// 学生信息结构体
typedef struct {
int id; // 学号
char name[20]; // 姓名
char gender[5]; // 性别
int chinese; // 语文成绩
int math; // 数学成绩
int english; // 英语成绩
int total; // 总分
float average; // 平均分
} Student;
// 学生信息表结构体
typedef struct {
Student *students; // 学生信息表
int num; // 学生数量
} StudentTable;
// 函数声明
void initTable(StudentTable *table);
void addStudent(StudentTable *table);
void deleteStudent(StudentTable *table);
void searchStudent(StudentTable *table);
void sortTable(StudentTable *table);
void saveTable(StudentTable *table);
void loadTable(StudentTable *table);
void printTable(StudentTable *table);
void destroyTable(StudentTable *table);
int main() {
StudentTable table;
initTable(&table); // 初始化学生信息表
loadTable(&table); // 从文件中加载学生信息
int choice = 0;
while (1) {
printf("请选择操作:\n");
printf("1. 添加学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 查找学生信息\n");
printf("4. 排序学生信息\n");
printf("5. 打印学生信息\n");
printf("6. 保存学生信息\n");
printf("7. 退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent(&table);
break;
case 2:
deleteStudent(&table);
break;
case 3:
searchStudent(&table);
break;
case 4:
sortTable(&table);
break;
case 5:
printTable(&table);
break;
case 6:
saveTable(&table);
break;
case 7:
destroyTable(&table);
return 0;
default:
printf("输入不合法,请重新输入。\n");
break;
}
}
}
// 初始化学生信息表
void initTable(StudentTable *table) {
table->students = (Student *) malloc(MAX_STUDENT_NUM * sizeof(Student));
table->num = 0;
}
// 添加学生信息
void addStudent(StudentTable *table) {
if (table->num == MAX_STUDENT_NUM) {
printf("学生信息表已满,添加失败。\n");
return;
}
printf("请输入学生信息:\n");
Student student;
printf("学号:");
scanf("%d", &student.id);
printf("姓名:");
scanf("%s", student.name);
printf("性别:");
scanf("%s", student.gender);
printf("语文成绩:");
scanf("%d", &student.chinese);
printf("数学成绩:");
scanf("%d", &student.math);
printf("英语成绩:");
scanf("%d", &student.english);
student.total = student.chinese + student.math + student.english;
student.average = (float) student.total / 3;
table->students[table->num] = student;
table->num++;
printf("添加成功。\n");
}
// 删除学生信息
void deleteStudent(StudentTable *table) {
if (table->num == 0) {
printf("学生信息表为空,删除失败。\n");
return;
}
int id;
printf("请输入要删除的学生学号:");
scanf("%d", &id);
for (int i = 0; i < table->num; i++) {
if (table->students[i].id == id) {
for (int j = i; j < table->num - 1; j++) {
table->students[j] = table->students[j + 1];
}
table->num--;
printf("删除成功。\n");
return;
}
}
printf("未找到该学生。\n");
}
// 查找学生信息
void searchStudent(StudentTable *table) {
if (table->num == 0) {
printf("学生信息表为空,查找失败。\n");
return;
}
int id;
printf("请输入要查找的学生学号:");
scanf("%d", &id);
for (int i = 0; i < table->num; i++) {
if (table->students[i].id == id) {
printf("找到学生信息如下:\n");
printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n");
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n", table->students[i].id, table->students[i].name,
table->students[i].gender, table->students[i].chinese, table->students[i].math,
table->students[i].english, table->students[i].total, table->students[i].average);
return;
}
}
printf("未找到该学生。\n");
}
// 排序学生信息
void sortTable(StudentTable *table) {
if (table->num == 0) {
printf("学生信息表为空,排序失败。\n");
return;
}
for (int i = 0; i < table->num - 1; i++) {
for (int j = 0; j < table->num - i - 1; j++) {
if (table->students[j].total < table->students[j + 1].total) {
Student temp = table->students[j];
table->students[j] = table->students[j + 1];
table->students[j + 1] = temp;
}
}
}
printf("排序成功。\n");
}
// 保存学生信息
void saveTable(StudentTable *table) {
FILE *fp = fopen("student_grad.txt", "w");
if (fp == NULL) {
printf("文件打开失败,保存失败。\n");
return;
}
fprintf(fp, "学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n");
for (int i = 0; i < table->num; i++) {
fprintf(fp, "%d\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n", table->students[i].id, table->students[i].name,
table->students[i].gender, table->students[i].chinese, table->students[i].math,
table->students[i].english, table->students[i].total, table->students[i].average);
}
fclose(fp);
printf("保存成功。\n");
}
// 从文件中加载学生信息
void loadTable(StudentTable *table) {
FILE *fp = fopen("student_grad.txt", "r");
if (fp == NULL) {
printf("文件打开失败,加载失败。\n");
return;
}
char buf[1024];
fgets(buf, sizeof(buf), fp); // 跳过第一行表头
while (fgets(buf, sizeof(buf), fp) != NULL) {
Student student;
sscanf(buf, "%d\t%s\t%s\t%d\t%d\t%d\t%d\t%f", &student.id, student.name, student.gender, &student.chinese,
&student.math, &student.english, &student.total, &student.average);
table->students[table->num] = student;
table->num++;
}
fclose(fp);
printf("加载成功。\n");
}
// 打印学生信息
void printTable(StudentTable *table) {
if (table->num == 0) {
printf("学生信息表为空,打印失败。\n");
return;
}
printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n");
for (int i = 0; i < table->num; i++) {
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n", table->students[i].id, table->students[i].name,
table->students[i].gender, table->students[i].chinese, table->students[i].math, table->students[i].english,
table->students[i].total, table->students[i].average);
}
}
// 销毁学生信息表
void destroyTable(StudentTable *table) {
free(table->students);
table->num = 0;
}
```
上述代码中,我们使用了两个结构体 `Student` 和 `StudentTable` 来存储学生信息。其中 `Student` 结构体用来存储单个学生的信息,包括学号、姓名、性别、语文、数学、英语、总分和平均分;`StudentTable` 结构体用来存储学生信息表,包括一个指向学生信息数组的指针 `students` 和一个整数 `num` 表示当前学生数量。
除了结构体之外,我们还使用了多个独立的函数来实现各种操作。具体来说:
- `initTable` 函数用来初始化学生信息表,即动态分配一块内存作为学生信息数组,并将学生数量设为0。
- `addStudent` 函数用来添加学生信息。在函数内部,我们首先判断学生信息表是否已满(即学生数量是否达到最大值),如果是则添加失败;否则,让用户输入学生信息,并计算总分和平均分,然后将学生信息添加到学生信息表中,并将学生数量加1。
- `deleteStudent` 函数用来删除某个学生的信息。在函数内部,我们首先判断学生信息表是否为空,如果是则删除失败;否则,让用户输入要删除的学生学号,然后在学生信息表中查找该学生,如果找到则将其删除,并将后面的学生信息往前挪一位。
- `searchStudent` 函数用来查找某个学生的信息。在函数内部,我们首先判断学生信息表是否为空,如果是则查找失败;否则,让用户输入要查找的学生学号,然后在学生信息表中查找该学生,如果找到则输出其信息。
- `sortTable` 函数用来按照学生总分降序排列学生信息。在函数内部,我们使用冒泡排序算法来实现,即对于学生信息表中的每个学生,比较其总分与后一个学生的总分大小,如果前者小于后者,则交换两个学生的位置。
- `saveTable` 函数用来将学生信息保存到文件中。在函数内部,我们首先打开一个文件,然后将学生信息表中的每个学生信息都输出到文件中。
- `loadTable` 函数用来从文件中加载学生信息。在函数内部,我们首先打开一个文件,然后逐行读取文件内容并解析,将每个学生信息添加到学生信息表中。
- `printTable` 函数用来打印学生信息表中的所有学生信息。
- `destroyTable` 函数用来销毁学生信息表,即释放动态分配的内存,并将学生数量设为0。
最后,在 `main` 函数中,我们使用一个无限循环来让用户选择要执行的操作,然后调用相应的函数来实现。在程序退出前,我们使用 `saveTable` 函数将学生信息保存到文件中,并使用 `destroyTable` 函数释放动态分配的内存。
阅读全文