要求用C语言编写: 且1.编写一个带结构的文件,存入电脑, 2.从电脑中读入一个带结构的文件,并进行删增改后,重新存入电脑, 3.文件是有纵横结构,每横表示一个记录 文件的第一行是 序号 姓名 班级 学号 文件的第二行是 1 狗蛋 1 90 并且能实现自动编号功能
时间: 2024-03-10 13:50:23 浏览: 20
好的,我会根据你的要求,用C语言编写一个带结构的文件,实现文件的增删改查操作,并且实现自动编号功能。
首先,我们需要定义一个结构体来表示每个记录,比如:
```c
typedef struct {
int id; // 学生编号
char name[20]; // 学生姓名
int class; // 学生班级
int number; // 学生学号
} Student;
```
然后,我们可以定义一个文件,每个记录占一行,用制表符`\t`分隔不同字段,比如:
```
序号 姓名 班级 学号
1 狗蛋 1 90
```
接下来,我们可以编写一个函数来读取文件中的记录,比如:
```c
int read_students(const char* filename, Student* students, int max_students) {
FILE* fp = fopen(filename, "r");
if (!fp) {
return -1;
}
int count = 0;
char line[100];
if (fgets(line, sizeof(line), fp)) { // 读取第一行,忽略
;
}
while (fgets(line, sizeof(line), fp)) {
if (count >= max_students) {
break;
}
char* p = line;
students[count].id = strtol(p, &p, 10);
p++; // skip tab
strcpy(students[count].name, p);
p = strchr(p, '\t') + 1;
students[count].class = strtol(p, &p, 10);
p++; // skip tab
students[count].number = strtol(p, &p, 10);
count++;
}
fclose(fp);
return count;
}
```
这个函数会把文件中的记录读取到一个数组中,并返回读取到的记录数。
接下来,我们可以编写一个函数来写入记录到文件中,比如:
```c
int write_students(const char* filename, const Student* students, int count) {
FILE* fp = fopen(filename, "w");
if (!fp) {
return -1;
}
fprintf(fp, "序号\t姓名\t班级\t学号\n");
for (int i = 0; i < count; i++) {
fprintf(fp, "%d\t%s\t%d\t%d\n",
students[i].id, students[i].name,
students[i].class, students[i].number);
}
fclose(fp);
return 0;
}
```
这个函数会把一个数组中的记录写入到文件中。
接下来,我们可以编写增、删、改函数来操作记录,比如:
```c
int add_student(Student* students, int max_students, int* count,
const char* name, int class, int number) {
if (*count >= max_students) {
return -1;
}
// 自动编号
int id = 1;
for (int i = 0; i < *count; i++) {
if (students[i].id >= id) {
id = students[i].id + 1;
}
}
students[*count].id = id;
strcpy(students[*count].name, name);
students[*count].class = class;
students[*count].number = number;
(*count)++;
return 0;
}
int remove_student(Student* students, int count, int id) {
for (int i = 0; i < count; i++) {
if (students[i].id == id) {
for (int j = i; j < count - 1; j++) {
students[j] = students[j+1];
}
count--;
return 0;
}
}
return -1;
}
int update_student(Student* students, int count, int id,
const char* name, int class, int number) {
for (int i = 0; i < count; i++) {
if (students[i].id == id) {
strcpy(students[i].name, name);
students[i].class = class;
students[i].number = number;
return 0;
}
}
return -1;
}
```
这几个函数分别实现了增加、删除和修改记录的功能。其中,增加记录会自动分配一个编号,需要指定学生姓名、班级和学号;删除记录需要指定学生编号;修改记录需要指定学生编号、姓名、班级和学号。
这样,我们就可以通过组合这些函数来实现一个完整的带结构的文件的增删改查功能了。