要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改
时间: 2024-03-11 08:43:25 浏览: 31
好的,我可以回答您的问题,并提供一份C语言代码来实现您的需求。
首先,您需要定义一个结构体来表示每个记录的信息,包括姓名、地址和学号。代码如下所示:
```c
typedef struct {
char name[20];
char address[50];
char id[10];
} Record;
```
接下来,您需要编写代码将这些记录写入文件中,可以使用fprintf()函数来实现。以下是一个示例函数,它将一个Record数组写入文件中:
```c
void write_records_to_file(char* filename, Record records[], int num_records) {
FILE* fp = fopen(filename, "w");
if (fp == NULL) {
printf("Failed to open file for writing.\n");
return;
}
// 写入表头
fprintf(fp, "%-20s%-50s%-10s\n", "姓名", "地址", "学号");
// 写入记录
for (int i = 0; i < num_records; i++) {
fprintf(fp, "%-20s%-50s%-10s\n", records[i].name, records[i].address, records[i].id);
}
fclose(fp);
}
```
接下来,您需要编写代码从文件中读取记录并将其存储在Record数组中。以下是一个示例函数,它从文件中读取记录:
```c
int read_records_from_file(char* filename, Record records[], int max_records) {
FILE* fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file for reading.\n");
return 0;
}
// 读取表头并验证格式
char name[20], address[50], id[10];
fscanf(fp, "%s %s %s\n", name, address, id);
if (strcmp(name, "姓名") != 0 || strcmp(address, "地址") != 0 || strcmp(id, "学号") != 0) {
printf("Invalid file format.\n");
fclose(fp);
return 0;
}
// 读取记录
int num_records = 0;
while (num_records < max_records && fscanf(fp, "%s %s %s\n", records[num_records].name, records[num_records].address, records[num_records].id) != EOF) {
num_records++;
}
fclose(fp);
return num_records;
}
```
有了这两个函数,您就可以将记录写入文件并从文件中读取它们。接下来,您可以编写代码来插入、删除和修改记录。以下是一个示例程序,它允许用户通过控制台输入操作和记录信息来执行这些操作:
```c
int main() {
Record records[100];
int num_records = read_records_from_file("records.txt", records, 100);
while (1) {
// 打印现有的记录
printf("现有的记录:\n");
printf("%-20s%-50s%-10s\n", "姓名", "地址", "学号");
for (int i = 0; i < num_records; i++) {
printf("%-20s%-50s%-10s\n", records[i].name, records[i].address, records[i].id);
}
// 询问用户要执行的操作
printf("请选择要执行的操作:\n");
printf("1. 插入一条记录\n");
printf("2. 删除一条记录\n");
printf("3. 修改一条记录\n");
printf("4. 退出程序\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1: {
// 插入一条记录
if (num_records >= 100) {
printf("记录已满,无法插入新记录。\n");
break;
}
printf("请输入新记录的信息:\n");
printf("姓名:");
scanf("%s", records[num_records].name);
printf("地址:");
scanf("%s", records[num_records].address);
printf("学号:");
scanf("%s", records[num_records].id);
num_records++;
printf("插入成功!\n");
break;
}
case 2: {
// 删除一条记录
if (num_records == 0) {
printf("记录为空,无法删除记录。\n");
break;
}
printf("请输入要删除的记录的学号:");
char id[10];
scanf("%s", id);
int i;
for (i = 0; i < num_records; i++) {
if (strcmp(records[i].id, id) == 0) {
break;
}
}
if (i == num_records) {
printf("未找到学号为%s的记录。\n", id);
break;
}
for (int j = i; j < num_records - 1; j++) {
records[j] = records[j+1];
}
num_records--;
printf("删除成功!\n");
break;
}
case 3: {
// 修改一条记录
if (num_records == 0) {
printf("记录为空,无法修改记录。\n");
break;
}
printf("请输入要修改的记录的学号:");
char id[10];
scanf("%s", id);
int i;
for (i = 0; i < num_records; i++) {
if (strcmp(records[i].id, id) == 0) {
break;
}
}
if (i == num_records) {
printf("未找到学号为%s的记录。\n", id);
break;
}
printf("请输入新的记录信息:\n");
printf("姓名:");
scanf("%s", records[i].name);
printf("地址:");
scanf("%s", records[i].address);
printf("学号:");
scanf("%s", records[i].id);
printf("修改成功!\n");
break;
}
case 4: {
// 退出程序
write_records_to_file("records.txt", records, num_records);
printf("程序已退出。\n");
return 0;
}
default: {
printf("无效的选择,请重新输入。\n");
break;
}
}
}
}
```
希望这份代码可以帮助您实现您的需求。如果您有任何问题,请随时问我。
阅读全文