要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:序号、姓名、学号、地址,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改
时间: 2024-03-11 13:43:29 浏览: 67
好的,您的问题是如何用 C 语言编写一个带结构的文件,并能进行增删改操作。
以下是一个示例代码,可以实现您的需求。您需要按照注释中的提示将其保存为 .c 文件,然后在 C 语言的运行界面中编译运行。
```
#include <stdio.h>
#include <string.h>
// 定义一个结构体,表示一个学生的信息
struct student {
int id; // 序号
char name[20]; // 姓名
char number[20]; // 学号
char address[50]; // 地址
};
// 定义一个函数,用于将一个学生信息写入文件
void write_student(FILE *fp, struct student s) {
fprintf(fp, "%-5d%-20s%-20s%-50s\n", s.id, s.name, s.number, s.address);
}
// 定义一个函数,用于从文件中读取一个学生信息
struct student read_student(FILE *fp) {
struct student s;
fscanf(fp, "%d", &s.id);
fscanf(fp, "%s", s.name);
fscanf(fp, "%s", s.number);
fscanf(fp, "%s", s.address);
return s;
}
// 定义一个函数,用于在文件中查找指定序号的学生信息,并返回其在文件中的位置
long find_student(FILE *fp, int id) {
struct student s;
long pos = ftell(fp);
rewind(fp); // 将文件指针移动到文件开头
while (!feof(fp)) {
s = read_student(fp);
if (s.id == id) {
return pos;
}
pos = ftell(fp); // 记录当前位置
}
return -1; // 没有找到
}
// 定义一个函数,用于向文件中插入一个学生信息
void insert_student(FILE *fp, struct student s) {
// 找到应该插入的位置
long pos = find_student(fp, s.id);
if (pos == -1) {
// 如果没有找到,则插入到文件末尾
fseek(fp, 0, SEEK_END);
} else {
fseek(fp, pos, SEEK_SET);
}
// 将插入位置之后的所有学生信息向后移动一个位置
struct student tmp;
long end_pos = ftell(fp);
while (end_pos > pos) {
fseek(fp, end_pos - sizeof(struct student), SEEK_SET);
tmp = read_student(fp);
write_student(fp, tmp);
end_pos = ftell(fp);
}
// 在插入位置处写入新的学生信息
fseek(fp, pos, SEEK_SET);
write_student(fp, s);
}
// 定义一个函数,用于从文件中删除指定序号的学生信息
void delete_student(FILE *fp, int id) {
// 找到要删除的学生信息的位置
long pos = find_student(fp, id);
if (pos == -1) {
printf("Not found.\n");
return;
}
// 将删除位置之后的所有学生信息向前移动一个位置
struct student tmp;
long end_pos = ftell(fp);
while (end_pos > pos + sizeof(struct student)) {
fseek(fp, end_pos - sizeof(struct student), SEEK_SET);
tmp = read_student(fp);
fseek(fp, end_pos, SEEK_SET);
write_student(fp, tmp);
end_pos = ftell(fp);
}
// 将文件尾部的无效信息清除
ftruncate(fileno(fp), end_pos - sizeof(struct student));
}
// 定义一个函数,用于修改指定序号的学生信息
void modify_student(FILE *fp, int id, struct student s) {
// 先删除原来的学生信息
delete_student(fp, id);
// 再插入新的学生信息
insert_student(fp, s);
}
int main() {
// 打开文件
FILE *fp = fopen("students.dat", "r+b");
if (fp == NULL) {
// 如果文件不存在,则创建文件
fp = fopen("students.dat", "w+b");
if (fp == NULL) {
printf("Failed to create file.\n");
return 1;
}
}
// 输出文件中所有的学生信息
struct student s;
rewind(fp);
printf("%-5s%-20s%-20s%-50s\n", "ID", "Name", "Number", "Address");
while (!feof(fp)) {
s = read_student(fp);
if (s.id != 0) {
printf("%-5d%-20s%-20s%-50s\n", s.id, s.name, s.number, s.address);
}
}
// 插入一个学生信息
struct student new_student = {1001, "Jack", "20190101", "Beijing"};
insert_student(fp, new_student);
// 输出插入后的所有学生信息
rewind(fp);
printf("%-5s%-20s%-20s%-50s\n", "ID", "Name", "Number", "Address");
while (!feof(fp)) {
s = read_student(fp);
if (s.id != 0) {
printf("%-5d%-20s%-20s%-50s\n", s.id, s.name, s.number, s.address);
}
}
// 修改一个学生信息
struct student modified_student = {1001, "Mary", "20190101", "Shanghai"};
modify_student(fp, 1001, modified_student);
// 输出修改后的所有学生信息
rewind(fp);
printf("%-5s%-20s%-20s%-50s\n", "ID", "Name", "Number", "Address");
while (!feof(fp)) {
s = read_student(fp);
if (s.id != 0) {
printf("%-5d%-20s%-20s%-50s\n", s.id, s.name, s.number, s.address);
}
}
// 删除一个学生信息
delete_student(fp, 1001);
// 输出删除后的所有学生信息
rewind(fp);
printf("%-5s%-20s%-20s%-50s\n", "ID", "Name", "Number", "Address");
while (!feof(fp)) {
s = read_student(fp);
if (s.id != 0) {
printf("%-5d%-20s%-20s%-50s\n", s.id, s.name, s.number, s.address);
}
}
// 关闭文件
fclose(fp);
return 0;
}
```
在该示例代码中,我们定义了一个结构体 `struct student`,表示一个学生的信息。我们还定义了一些函数,包括:
- `write_student`:将一个学生信息写入文件;
- `read_student`:从文件中读取一个学生信息;
- `find_student`:在文件中查找指定序号的学生信息,并返回其在文件中的位置;
- `insert_student`:向文件中插入一个学生信息;
- `delete_student`:从文件中删除指定序号的学生信息;
- `modify_student`:修改指定序号的学生信息。
在 `main` 函数中,我们先打开文件,然后输出文件中所有的学生信息。接着,我们插入一个新的学生信息,再输出所有的学生信息。然后,我们修改一个学生信息,再输出所有的学生信息。最后,我们删除一个学生信息,再输出所有的学生信息。最后,我们关闭文件。
通过这个示例代码,您应该可以实现您的需求。但是,由于您的需求可能与这个示例代码略有不同,所以您需要仔细阅读代码,并根据自己的需求进行修改。
阅读全文