要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改
时间: 2024-03-18 14:38:46 浏览: 19
好的,我明白了。以下是一个简单的实现,你可以根据需要进行修改和优化。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 20
#define MAX_ADDRESS_LENGTH 50
#define MAX_ID_LENGTH 10
#define MAX_RECORD_LENGTH (MAX_NAME_LENGTH + MAX_ADDRESS_LENGTH + MAX_ID_LENGTH + 3) // 每个记录的最大长度,3是分隔符的数量
typedef struct {
char name[MAX_NAME_LENGTH];
char address[MAX_ADDRESS_LENGTH];
char id[MAX_ID_LENGTH];
} Record;
// 从文件中读入所有记录
int read_records(Record *records, int max_records, const char *filename) {
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL) {
printf("Failed to open file %s\n", filename);
return -1;
}
int num_records = 0;
char line[MAX_RECORD_LENGTH];
while (fgets(line, sizeof(line), fp)) {
// 解析每一行,将姓名、地址、学号分别存入对应的字段
char *token = strtok(line, " ");
strncpy(records[num_records].name, token, MAX_NAME_LENGTH);
token = strtok(NULL, " ");
strncpy(records[num_records].address, token, MAX_ADDRESS_LENGTH);
token = strtok(NULL, " ");
strncpy(records[num_records].id, token, MAX_ID_LENGTH);
num_records++;
if (num_records >= max_records) {
printf("Too many records in file %s\n", filename);
break;
}
}
fclose(fp);
return num_records;
}
// 将所有记录写入文件
void write_records(const Record *records, int num_records, const char *filename) {
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) {
printf("Failed to open file %s\n", filename);
return;
}
for (int i = 0; i < num_records; i++) {
fprintf(fp, "%-*s %-*s %-*s\n", MAX_NAME_LENGTH, records[i].name, MAX_ADDRESS_LENGTH, records[i].address, MAX_ID_LENGTH, records[i].id);
}
fclose(fp);
}
// 在所有记录中查找指定学号的记录
int find_record(const Record *records, int num_records, const char *id) {
for (int i = 0; i < num_records; i++) {
if (strcmp(records[i].id, id) == 0) {
return i;
}
}
return -1;
}
// 在指定位置插入一条记录
void insert_record(Record *records, int *num_records, int pos, const Record *record) {
// 将pos及以后的记录后移一位
for (int i = *num_records; i > pos; i--) {
records[i] = records[i-1];
}
// 插入新记录
records[pos] = *record;
(*num_records)++;
}
// 删除指定位置的记录
void delete_record(Record *records, int *num_records, int pos) {
// 将pos以后的记录前移一位
for (int i = pos; i < *num_records-1; i++) {
records[i] = records[i+1];
}
(*num_records)--;
}
// 修改指定位置的记录
void modify_record(Record *records, int pos, const Record *new_record) {
records[pos] = *new_record;
}
int main() {
const char *filename = "records.txt";
const int max_records = 100;
Record records[max_records];
int num_records = read_records(records, max_records, filename);
while (1) {
// 打印所有记录
printf("\n");
printf("%-*s %-*s %-*s\n", MAX_NAME_LENGTH, "姓名", MAX_ADDRESS_LENGTH, "地址", MAX_ID_LENGTH, "学号");
for (int i = 0; i < num_records; i++) {
printf("%-*s %-*s %-*s\n", MAX_NAME_LENGTH, records[i].name, MAX_ADDRESS_LENGTH, records[i].address, MAX_ID_LENGTH, records[i].id);
}
// 提示操作类型
printf("\n请选择操作类型:\n");
printf("1. 插入记录\n");
printf("2. 删除记录\n");
printf("3. 修改记录\n");
printf("4. 退出程序\n");
int choice;
scanf("%d", &choice);
if (choice == 1) {
// 插入记录
Record record;
printf("请输入姓名、地址、学号,以空格分隔:\n");
scanf("%s%s%s", record.name, record.address, record.id);
insert_record(records, &num_records, num_records, &record); // 在末尾插入
write_records(records, num_records, filename);
} else if (choice == 2) {
// 删除记录
char id[MAX_ID_LENGTH];
printf("请输入要删除的学号:\n");
scanf("%s", id);
int pos = find_record(records, num_records, id);
if (pos >= 0) {
delete_record(records, &num_records, pos);
write_records(records, num_records, filename);
} else {
printf("未找到学号为%s的记录\n", id);
}
} else if (choice == 3) {
// 修改记录
char id[MAX_ID_LENGTH];
printf("请输入要修改的学号:\n");
scanf("%s", id);
int pos = find_record(records, num_records, id);
if (pos >= 0) {
Record new_record;
printf("请输入新的姓名、地址、学号,以空格分隔:\n");
scanf("%s%s%s", new_record.name, new_record.address, new_record.id);
modify_record(records, pos, &new_record);
write_records(records, num_records, filename);
} else {
printf("未找到学号为%s的记录\n", id);
}
} else if (choice == 4) {
// 退出程序
break;
} else {
printf("无效的操作类型\n");
}
}
return 0;
}
```
该程序会从名为`records.txt`的文件中读取所有记录,并提供插入、删除和修改记录的功能。每次操作后会将修改后的记录重新写入文件。在程序运行过程中,你可以按照提示进行操作。