请用C语言编写完整的程序,要求: 1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。 2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑, 3.这个文件要有纵横结构,每横表示一个记录 4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改, 其中学生信息存储在students.dat文件中 能在文件中第一行显示姓名、地址、学号,并且修改后能够自动保存。printf打印的部分要用中文
时间: 2024-03-11 17:43:46 浏览: 151
很好,以下是一个基本的程序,实现了您所需的功能。请注意,这只是一个基本的框架,您可以根据需要进行修改和扩展。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_ADDR_LEN 50
#define MAX_ID_LEN 10
// 定义学生信息结构体
typedef struct student {
char name[MAX_NAME_LEN];
char addr[MAX_ADDR_LEN];
char id[MAX_ID_LEN];
} Student;
// 定义文件头部结构体
typedef struct file_header {
char name_title[MAX_NAME_LEN];
char addr_title[MAX_ADDR_LEN];
char id_title[MAX_ID_LEN];
} FileHeader;
// 定义全局变量
FILE *file;
int num_records;
// 函数声明
void add_record();
void delete_record();
void modify_record();
void display_records();
// 主函数
int main() {
int choice;
FileHeader header;
Student student;
// 打开文件
if ((file = fopen("students.dat", "rb+")) == NULL) {
printf("文件打开失败!\n");
exit(1);
}
// 读取文件头部信息
fread(&header, sizeof(header), 1, file);
// 如果文件没有记录,需要添加文件头部信息
if (feof(file)) {
printf("请输入姓名、地址、学号:\n");
scanf("%s %s %s", header.name_title, header.addr_title, header.id_title);
fwrite(&header, sizeof(header), 1, file);
}
// 统计记录数
fseek(file, 0, SEEK_END);
num_records = ftell(file) / sizeof(student);
// 显示菜单
while (1) {
printf("\n请选择操作:\n");
printf("1. 添加记录\n");
printf("2. 删除记录\n");
printf("3. 修改记录\n");
printf("4. 显示记录\n");
printf("5. 退出程序\n");
printf("请输入选项:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
add_record();
break;
case 2:
delete_record();
break;
case 3:
modify_record();
break;
case 4:
display_records();
break;
case 5:
fclose(file);
exit(0);
default:
printf("输入无效,请重新输入!\n");
break;
}
}
return 0;
}
// 添加记录函数
void add_record() {
Student student;
printf("请输入学生姓名、地址、学号:\n");
scanf("%s %s %s", student.name, student.addr, student.id);
// 写入新记录
fseek(file, 0, SEEK_END);
fwrite(&student, sizeof(student), 1, file);
num_records++;
printf("添加成功!\n");
}
// 删除记录函数
void delete_record() {
int i, n;
Student student;
printf("请输入要删除的记录编号(1-%d):\n", num_records);
scanf("%d", &n);
// 删除记录
fseek(file, (n - 1) * sizeof(student), SEEK_SET);
fread(&student, sizeof(student), 1, file);
for (i = n; i < num_records; i++) {
fseek(file, i * sizeof(student), SEEK_SET);
fread(&student, sizeof(student), 1, file);
fseek(file, (i - 1) * sizeof(student), SEEK_SET);
fwrite(&student, sizeof(student), 1, file);
}
num_records--;
fseek(file, num_records * sizeof(student), SEEK_SET);
ftruncate(fileno(file), ftell(file));
printf("删除成功!\n");
}
// 修改记录函数
void modify_record() {
int n;
Student student;
printf("请输入要修改的记录编号(1-%d):\n", num_records);
scanf("%d", &n);
// 修改记录
fseek(file, (n - 1) * sizeof(student), SEEK_SET);
fread(&student, sizeof(student), 1, file);
printf("请输入新的学生姓名、地址、学号:\n");
scanf("%s %s %s", student.name, student.addr, student.id);
fseek(file, (n - 1) * sizeof(student), SEEK_SET);
fwrite(&student, sizeof(student), 1, file);
printf("修改成功!\n");
}
// 显示记录函数
void display_records() {
int i;
Student student;
printf("姓名\t\t地址\t\t\t学号\n");
printf("---------------------------------------------------\n");
fseek(file, sizeof(FileHeader), SEEK_SET);
for (i = 0; i < num_records; i++) {
fread(&student, sizeof(student), 1, file);
printf("%-10s\t%-20s\t%-10s\n", student.name, student.addr, student.id);
}
}
```
这个程序包含了添加、删除、修改和显示记录的基本功能,并能够在文件中保存记录。您可以根据需要进行修改和扩展,以满足您的具体需求。
阅读全文