要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:序号、姓名、班级、学号,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改
时间: 2024-03-18 16:40:30 浏览: 19
好的,我明白了您的问题。以下是一个可能的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 20
#define MAX_CLASS_LENGTH 10
#define MAX_ID_LENGTH 10
typedef struct {
int id;
char name[MAX_NAME_LENGTH];
char class[MAX_CLASS_LENGTH];
char student_id[MAX_ID_LENGTH];
} Record;
void print_header() {
printf("序号\t姓名\t班级\t学号\n");
}
void print_record(Record r) {
printf("%d\t%s\t%s\t%s\n", r.id, r.name, r.class, r.student_id);
}
int get_record_count(FILE* fp) {
int count = 0;
char line[1024];
while (fgets(line, sizeof(line), fp) != NULL) {
count++;
}
rewind(fp);
return count - 1; // 减去表头
}
void read_records(Record* records, int count, FILE* fp) {
char line[1024];
fgets(line, sizeof(line), fp); // 忽略表头
for (int i = 0; i < count; i++) {
fgets(line, sizeof(line), fp);
sscanf(line, "%d %s %s %s", &records[i].id, records[i].name, records[i].class, records[i].student_id);
}
}
void write_records(Record* records, int count, FILE* fp) {
fprintf(fp, "序号\t姓名\t班级\t学号\n");
for (int i = 0; i < count; i++) {
fprintf(fp, "%d\t%s\t%s\t%s\n", records[i].id, records[i].name, records[i].class, records[i].student_id);
}
}
void insert_record(Record* records, int* count, Record r, int index) {
for (int i = *count; i > index; i--) {
records[i] = records[i - 1];
records[i].id++;
}
records[index] = r;
records[index].id = index;
(*count)++;
}
void delete_record(Record* records, int* count, int index) {
for (int i = index; i < *count - 1; i++) {
records[i] = records[i + 1];
records[i].id--;
}
(*count)--;
}
void modify_record(Record* records, int index) {
printf("请输入新的姓名:");
scanf("%s", records[index].name);
printf("请输入新的班级:");
scanf("%s", records[index].class);
printf("请输入新的学号:");
scanf("%s", records[index].student_id);
}
int main() {
FILE* fp = fopen("records.txt", "r+");
if (fp == NULL) {
printf("文件打开失败!\n");
return 1;
}
int count = get_record_count(fp);
Record* records = (Record*) malloc(count * sizeof(Record));
read_records(records, count, fp);
printf("读入了 %d 条记录:\n", count);
print_header();
for (int i = 0; i < count; i++) {
print_record(records[i]);
}
char op;
int index;
Record r;
while (1) {
printf("请输入操作类型(i/d/m/q):");
scanf(" %c", &op);
if (op == 'q') {
break;
}
switch (op) {
case 'i':
printf("请输入要插入的位置:");
scanf("%d", &index);
if (index < 0 || index > count) {
printf("无效的位置!\n");
break;
}
printf("请输入要插入的记录(格式:姓名 班级 学号):");
r.id = -1; // 插入时会重新分配序号
scanf("%s %s %s", r.name, r.class, r.student_id);
insert_record(records, &count, r, index);
printf("插入成功!\n");
break;
case 'd':
printf("请输入要删除的位置:");
scanf("%d", &index);
if (index < 0 || index >= count) {
printf("无效的位置!\n");
break;
}
delete_record(records, &count, index);
printf("删除成功!\n");
break;
case 'm':
printf("请输入要修改的位置:");
scanf("%d", &index);
if (index < 0 || index >= count) {
printf("无效的位置!\n");
break;
}
modify_record(records, index);
printf("修改成功!\n");
break;
default:
printf("无效的操作类型!\n");
break;
}
// 保存修改后的记录到文件中
rewind(fp);
write_records(records, count, fp);
}
fclose(fp);
free(records);
return 0;
}
```
这段代码实现了您的要求,具体说明如下:
- `Record` 是记录的结构体,包含四个字段:序号、姓名、班级和学号。
- `print_header()` 和 `print_record()` 分别用于打印表头和一条记录。
- `get_record_count()` 用于获取文件中记录的数量。
- `read_records()` 用于从文件中读取记录。
- `write_records()` 用于将记录写入文件。
- `insert_record()` 用于在指定位置插入一条记录。
- `delete_record()` 用于删除指定位置的记录。
- `modify_record()` 用于修改指定位置的记录。
- `main()` 函数用于控制程序的流程,包括读取文件、执行操作、保存修改后的记录等。
您只需要将表格保存为名为 `records.txt` 的文本文件,然后编译并运行上述代码,即可在命令行界面进行插入、删除和修改操作。注意,在进行修改、删除操作时需要输入记录的位置(从 0 开始),而在进行插入操作时需要输入要插入的位置(从 0 开始),并按照格式输入要插入的记录。