请给我一个用C语言编写的完整程序,要求: 1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:序号、姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。 2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑, 3.这个文件要有纵横结构,每横表示一个记录 4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改, 其中学生信息存储在students.dat文件中 能在文件中第一行显示姓名、地址、学号,并且修改后能够自动保存。printf打印的部分要用中文
时间: 2024-03-11 16:43:47 浏览: 50
C语言程序设计课件:9 文件.ppt
好的,以下是一个示例程序,用于实现你的要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100 // 最多存放100个学生信息
#define LINE_LEN 80 // 文件每行最大长度
// 定义学生信息结构体
typedef struct {
int id; // 序号
char name[20]; // 姓名
char address[50]; // 地址
char number[10]; // 学号
} Student;
// 读取学生信息文件
int readStudents(Student *students) {
FILE *fp;
int i = 0;
char line[LINE_LEN];
fp = fopen("students.dat", "rb");
if (fp == NULL) {
printf("文件打开失败!\n");
return 0;
}
fgets(line, LINE_LEN, fp); // 跳过第一行
while (fgets(line, LINE_LEN, fp) != NULL) {
sscanf(line, "%d %s %s %s", &students[i].id, students[i].name, students[i].address,
students[i].number);
i++;
}
fclose(fp);
return i; // 返回学生信息数量
}
// 写入学生信息文件
void writeStudents(Student *students, int count) {
FILE *fp;
int i;
fp = fopen("students.dat", "wb");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fprintf(fp, "%-6s%-8s%-30s%-12s\n", "序号", "姓名", "地址", "学号");
for (i = 0; i < count; i++) {
fprintf(fp, "%-6d%-8s%-30s%-12s\n", students[i].id, students[i].name, students[i].address,
students[i].number);
}
fclose(fp);
}
// 插入学生信息
void insertStudent(Student *students, int *count) {
if (*count >= MAX_STUDENTS) {
printf("学生信息已满,无法插入!\n");
return;
}
printf("请输入新学生信息(格式:序号 姓名 地址 学号):");
scanf("%d %s %s %s", &students[*count].id, students[*count].name, students[*count].address,
students[*count].number);
(*count)++; // 记得更新学生信息数量
}
// 删除学生信息
void deleteStudent(Student *students, int *count) {
int i, id;
if (*count == 0) {
printf("学生信息为空,无法删除!\n");
return;
}
printf("请输入要删除的学生序号:");
scanf("%d", &id);
for (i = 0; i < *count; i++) {
if (students[i].id == id) {
// 将待删除学生信息之后的所有信息向前移动一位
memmove(&students[i], &students[i + 1], (*count - i - 1) * sizeof(Student));
(*count)--; // 记得更新学生信息数量
printf("学生信息已删除成功!\n");
return;
}
}
printf("未找到要删除的学生信息!\n");
}
// 修改学生信息
void modifyStudent(Student *students, int count) {
int i, id;
if (count == 0) {
printf("学生信息为空,无法修改!\n");
return;
}
printf("请输入要修改的学生序号:");
scanf("%d", &id);
for (i = 0; i < count; i++) {
if (students[i].id == id) {
printf("请输入新的学生信息(格式:姓名 地址 学号):");
scanf("%s %s %s", students[i].name, students[i].address, students[i].number);
printf("学生信息已修改成功!\n");
return;
}
}
printf("未找到要修改的学生信息!\n");
}
int main() {
Student students[MAX_STUDENTS];
int count = 0, choice;
count = readStudents(students);
do {
printf("\n");
printf("1. 显示所有学生信息\n");
printf("2. 插入新的学生信息\n");
printf("3. 删除一个学生信息\n");
printf("4. 修改一个学生信息\n");
printf("0. 退出程序\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1: // 显示所有学生信息
if (count == 0) {
printf("学生信息为空!\n");
} else {
printf("%-6s%-8s%-30s%-12s\n", "序号", "姓名", "地址", "学号");
for (int i = 0; i < count; i++) {
printf("%-6d%-8s%-30s%-12s\n", students[i].id, students[i].name,
students[i].address, students[i].number);
}
}
break;
case 2: // 插入新的学生信息
insertStudent(students, &count);
break;
case 3: // 删除一个学生信息
deleteStudent(students, &count);
break;
case 4: // 修改一个学生信息
modifyStudent(students, count);
break;
case 0: // 退出程序
break;
default:
printf("无效的选择!\n");
break;
}
writeStudents(students, count); // 操作完毕后自动保存学生信息
} while (choice != 0);
return 0;
}
```
注意,在这个示例程序中,我们使用了格式化输出函数`printf`来输出学生信息,并使用了空格来补齐不足的位数,以保证文件的纵横结构。同时,我们使用了二进制文件来存储学生信息,以保证数据的完整性。在插入、删除和修改学生信息时,我们使用了`memmove`函数来移动数组元素,以保证删除和修改操作的正确性。最后,在每次操作后,我们都会自动保存学生信息,以避免程序异常终止导致数据丢失。
阅读全文