请给我一个用C语言编写的完整程序,要求: 1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:序号、姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。 2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑, 3.这个文件要有纵横结构,每横表示一个记录 4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改, 其中学生信息存储在students.dat文件中 能在文件中第一行显示姓名、地址、学号,并且修改后能够自动保存。printf打印的部分要用中文
时间: 2024-03-11 09:43:45 浏览: 60
好的,以下是符合要求的完整程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
int id;
char name[20];
char address[50];
char number[20];
};
void printHeader() {
printf("%-10s%-20s%-30s%-20s\n", "序号", "姓名", "地址", "学号");
}
void printStudent(struct student s) {
printf("%-10d%-20s%-30s%-20s\n", s.id, s.name, s.address, s.number);
}
void insertStudent(struct student *s, int *count) {
printf("请输入学生信息:\n");
printf("序号:");
scanf("%d", &(s[*count].id));
printf("姓名:");
scanf("%s", s[*count].name);
printf("地址:");
scanf("%s", s[*count].address);
printf("学号:");
scanf("%s", s[*count].number);
(*count)++;
}
void deleteStudent(struct student *s, int *count) {
int id;
printf("请输入要删除的学生序号:");
scanf("%d", &id);
int i = 0;
for (; i < *count; i++) {
if (s[i].id == id) {
break;
}
}
if (i == *count) {
printf("未找到序号为%d的学生!\n", id);
return;
}
for (; i < *count - 1; i++) {
s[i] = s[i + 1];
}
(*count)--;
printf("删除成功!\n");
}
void updateStudent(struct student *s, int count) {
int id;
printf("请输入要修改的学生序号:");
scanf("%d", &id);
int i = 0;
for (; i < count; i++) {
if (s[i].id == id) {
break;
}
}
if (i == count) {
printf("未找到序号为%d的学生!\n", id);
return;
}
printf("请输入新的学生信息:\n");
printf("序号:");
scanf("%d", &(s[i].id));
printf("姓名:");
scanf("%s", s[i].name);
printf("地址:");
scanf("%s", s[i].address);
printf("学号:");
scanf("%s", s[i].number);
printf("修改成功!\n");
}
int main() {
FILE *fp;
fp = fopen("students.dat", "rb+");
if (fp == NULL) {
printf("文件打开失败!");
exit(1);
}
struct student stu[100];
int count = 0;
while (fread(&stu[count], sizeof(struct student), 1, fp) == 1) {
count++;
}
printHeader();
for (int i = 0; i < count; i++) {
printStudent(stu[i]);
}
int choice;
while (1) {
printf("\n请选择操作:\n");
printf("1. 插入学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 修改学生信息\n");
printf("0. 退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
insertStudent(stu, &count);
break;
case 2:
deleteStudent(stu, &count);
break;
case 3:
updateStudent(stu, count);
break;
case 0:
break;
default:
printf("输入有误,请重新选择!");
break;
}
if (choice == 0) {
break;
}
printf("\n当前学生信息:\n");
printHeader();
for (int i = 0; i < count; i++) {
printStudent(stu[i]);
}
}
rewind(fp);
fwrite(stu, sizeof(struct student), count, fp);
fclose(fp);
return 0;
}
```
程序中定义了一个 `student` 结构体,包含了学生的序号、姓名、地址和学号。在 `main` 函数中,首先读取 `students.dat` 文件中的学生信息,并打印出来。接着进入一个循环,根据用户的选择进行插入、删除或修改操作,每次操作后都会打印出当前所有学生的信息。当用户选择退出程序时,将修改后的学生信息写回 `students.dat` 文件中。
程序中还定义了一些辅助函数,如打印表头、打印一个学生的信息、插入一个新的学生信息、删除一个学生信息、修改一个学生信息等。
注意:这个程序只是提供了一个思路,实际应用中还需要进行错误处理、优化等方面的工作。
阅读全文