要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改
时间: 2024-03-10 20:51:08 浏览: 56
好的,我可以为您提供一份C语言代码,实现您的需求。不过在开始前,需要确定一下您的操作系统,因为不同的操作系统对于文件读写的方式有所不同。此处假设您的操作系统是Windows,代码如下:
```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
#define MAX_RECORDS 100
// 定义学生结构体
typedef struct {
char name[MAX_NAME_LEN];
char addr[MAX_ADDR_LEN];
char id[MAX_ID_LEN];
} student;
// 定义记录结构体
typedef struct {
student stu;
int valid; // 1表示记录有效,0表示记录无效
} record;
// 定义全局变量
int num_records = 0; // 记录数
record records[MAX_RECORDS]; // 记录数组
// 函数声明
void read_file();
void write_file();
void print_record(record r);
void print_records();
int find_record(char* id);
void add_record();
void delete_record();
void modify_record();
// 读取文件
void read_file() {
FILE* fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("文件不存在!\n");
return;
}
char buf[MAX_NAME_LEN + MAX_ADDR_LEN + MAX_ID_LEN + 3];
fgets(buf, MAX_NAME_LEN + MAX_ADDR_LEN + MAX_ID_LEN + 3, fp); // 读取文件头
while (fgets(buf, MAX_NAME_LEN + MAX_ADDR_LEN + MAX_ID_LEN + 3, fp) != NULL) {
// 解析一行记录
char* name = strtok(buf, " ");
char* addr = strtok(NULL, " ");
char* id = strtok(NULL, " ");
// 去掉字符串末尾的换行符
if (id[strlen(id) - 1] == '\n') {
id[strlen(id) - 1] = '\0';
}
// 添加到记录数组
strcpy(records[num_records].stu.name, name);
strcpy(records[num_records].stu.addr, addr);
strcpy(records[num_records].stu.id, id);
records[num_records].valid = 1;
num_records++;
}
fclose(fp);
}
// 写入文件
void write_file() {
FILE* fp = fopen("data.txt", "w");
if (fp == NULL) {
printf("文件无法写入!\n");
return;
}
// 写入文件头
fprintf(fp, "%-20s %-50s %-10s\n", "姓名", "地址", "学号");
// 写入记录
for (int i = 0; i < num_records; i++) {
if (records[i].valid) {
fprintf(fp, "%-20s %-50s %-10s\n", records[i].stu.name, records[i].stu.addr, records[i].stu.id);
}
}
fclose(fp);
}
// 打印一条记录
void print_record(record r) {
printf("%-20s %-50s %-10s\n", r.stu.name, r.stu.addr, r.stu.id);
}
// 打印所有记录
void print_records() {
printf("%-20s %-50s %-10s\n", "姓名", "地址", "学号");
for (int i = 0; i < num_records; i++) {
if (records[i].valid) {
print_record(records[i]);
}
}
}
// 查找记录
int find_record(char* id) {
for (int i = 0; i < num_records; i++) {
if (records[i].valid && strcmp(records[i].stu.id, id) == 0) {
return i;
}
}
return -1;
}
// 添加记录
void add_record() {
if (num_records >= MAX_RECORDS) {
printf("记录已满,无法添加!\n");
return;
}
student s;
printf("请输入姓名:");
scanf("%s", s.name);
printf("请输入地址:");
scanf("%s", s.addr);
printf("请输入学号:");
scanf("%s", s.id);
int idx = find_record(s.id);
if (idx != -1) {
printf("学号已存在,无法添加!\n");
return;
}
strcpy(records[num_records].stu.name, s.name);
strcpy(records[num_records].stu.addr, s.addr);
strcpy(records[num_records].stu.id, s.id);
records[num_records].valid = 1;
num_records++;
}
// 删除记录
void delete_record() {
char id[MAX_ID_LEN];
printf("请输入要删除的学生学号:");
scanf("%s", id);
int idx = find_record(id);
if (idx == -1) {
printf("学号不存在,无法删除!\n");
return;
}
records[idx].valid = 0;
}
// 修改记录
void modify_record() {
char id[MAX_ID_LEN];
printf("请输入要修改的学生学号:");
scanf("%s", id);
int idx = find_record(id);
if (idx == -1) {
printf("学号不存在,无法修改!\n");
return;
}
printf("请输入新的姓名(原姓名:%s):", records[idx].stu.name);
scanf("%s", records[idx].stu.name);
printf("请输入新的地址(原地址:%s):", records[idx].stu.addr);
scanf("%s", records[idx].stu.addr);
printf("请输入新的学号(原学号:%s):", records[idx].stu.id);
scanf("%s", records[idx].stu.id);
}
int main() {
read_file();
int choice;
do {
printf("\n------------------------\n");
printf("1. 查看所有记录\n");
printf("2. 添加记录\n");
printf("3. 删除记录\n");
printf("4. 修改记录\n");
printf("0. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
print_records();
break;
case 2:
add_record();
break;
case 3:
delete_record();
break;
case 4:
modify_record();
break;
case 0:
break;
default:
printf("无效选择!\n");
break;
}
} while (choice != 0);
write_file();
return 0;
}
```
代码解释:
1. 定义了学生结构体和记录结构体,以及全局变量 `num_records` 和 `records`,表示记录数和记录数组。
2. 通过 `read_file()` 函数从文件中读取数据,并解析为记录数组。
3. 通过 `write_file()` 函数将记录数组写入文件中。
4. 通过 `print_record()` 和 `print_records()` 函数分别打印一条记录和所有记录。
5. 通过 `find_record()` 函数在记录数组中查找指定学号的记录。
6. 通过 `add_record()` 函数向记录数组中添加一条记录。
7. 通过 `delete_record()` 函数从记录数组中删除一条记录。
8. 通过 `modify_record()` 函数修改记录数组中的一条记录。
9. 在 `main()` 函数中实现了一个简单的菜单界面,可以让用户选择查看、添加、删除、修改或退出操作。
10. 在程序结束时通过 `write_file()` 函数将修改后的记录数组写入文件中。
需要注意的是,在本代码实现中,文件中的第一行必须是表头,且每列的宽度已经预设为姓名20个字符,地址50个字符,学号10个字符,因此这些宽度信息不需要从文件中读取。如果您需要更改这些宽度信息,可以修改代码中的相应常量。
阅读全文