C语言子函数将结构体写入文件
时间: 2024-04-01 22:26:59 浏览: 129
可以使用C语言的文件操作函数来将结构体写入文件。具体步骤如下:
1. 定义一个结构体,包含需要保存的数据。
2. 打开文件,使用fopen函数打开一个文件并返回一个文件指针。
3. 将结构体数据写入文件,使用fwrite函数将结构体数据写入文件。需要指定要写入的数据、每个数据的大小以及要写入的数据数量。
4. 关闭文件,使用fclose函数关闭文件。
下面是一个示例代码:
```c
#include <stdio.h>
// 定义一个学生结构体
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
struct Student student = {"John Doe", 20, 3.8};
// 打开文件
FILE *file = fopen("student.txt", "wb");
if (file != NULL) {
// 将结构体数据写入文件
fwrite(&student, sizeof(struct Student), 1, file);
// 关闭文件
fclose(file);
printf("写入成功!\n");
} else {
printf("无法打开文件!\n");
}
return 0;
}
```
相关问题
C语言子函数将结构体写入文件乱码
C语言中,将结构体写入文件可能出现乱码的情况,一般是因为结构体中包含了指针或者非字符类型的成员,在写入文件时需要进行额外的处理。以下是一种常用的处理方式:
1. 首先,将结构体成员逐个写入文件,而不是直接将整个结构体写入文件。这样可以避免指针和非字符类型的成员在写入文件时导致的问题。
2. 对于字符串类型的成员,使用`fwrite`函数将字符串以及字符串长度写入文件,而不是直接写入字符串指针。
3. 对于指针类型的成员,需要先将指针指向的内容写入文件,然后在读取时再重新分配内存并将内容读取到指针所指向的位置。这样可以确保指针在写入和读取过程中指向正确的内存位置。
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
int age;
} Person;
void writePerson(FILE* file, const Person* person) {
fwrite(person->name, sizeof(char), strlen(person->name) + 1, file);
fwrite(&(person->age), sizeof(int), 1, file);
}
void readPerson(FILE* file, Person* person) {
fread(person->name, sizeof(char), 20, file);
fread(&(person->age), sizeof(int), 1, file);
}
int main() {
FILE* file = fopen("person.dat", "wb");
if (file == NULL) {
printf("Failed to open file.\n");
return 1;
}
Person person = {"John Smith", 30};
writePerson(file, &person);
fclose(file);
file = fopen("person.dat", "rb");
if (file == NULL) {
printf("Failed to open file.\n");
return 1;
}
Person readPerson;
readPerson(file, &readPerson);
printf("Name: %s\n", readPerson.name); printf("Age: %d\n", readPerson.age);
fclose(file);
return 0;
}
```
这样处理后,写入文件时不会出现乱码的问题。读取时同样需要按照相同的方式进行读取,确保数据被正确还原。
学生健康管理系统的设计与实现 主要实现学生健康情况管理的几个操作功能:新建、插入、删除、写入文件和查询、屏幕输出功能。健康表中学生的信息由学号、姓名、出生日期、性别、身体状况。 利用二叉树来实现,系统的菜单功能如下: 1、新建学生健康表 2、向学生健康表插入学生信息 3、从文件中读取健康表信息 4、向文件写入学生健康表信息 5、在建康表中查询学生信息(按学号进行查询) 6、在屏幕中输出全部学生信息 7、退出 实验设计 以排序二叉树为储存机制,可以方便的实现插入或删除学生信息。每个学生的信息储存在一个结构体 Student中,并且这个结构体帯有输出学生信息的函数output()。然后以这个结构体作为二叉树节点的数据类 型,这样就实现了学生信息的存储。在创建二叉树对象时将已存储在文件中的学生信息写入二叉树,在析构函数里实现将学生信息写入文件。 使用C语言,充分使用数据结构中的二叉树知识 语言简明,模块清晰。请写出这样的代码,并含有注释
/*学生健康管理系统*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*定义学生信息结构体*/
typedef struct student{
char id[20]; //学号
char name[20]; //姓名
char birth[20]; //出生日期
char gender[10]; //性别
char health[50]; //身体状况
}Student;
/*定义二叉树结构体*/
typedef struct node{
Student data; //学生信息
struct node *left; //左子树
struct node *right; //右子树
}Node, *Tree;
/*函数声明*/
void create(Tree *root); //新建学生健康表
void insert(Tree *root); //向学生健康表插入学生信息
void read_file(Tree *root); //从文件中读取健康表信息
void write_file(Tree root); //向文件写入学生健康表信息
void search(Tree root); //在健康表中查询学生信息
void output(Tree root); //在屏幕中输出全部学生信息
void destroy(Tree root); //销毁二叉树
/*主函数*/
int main(){
Tree root = NULL; //初始化二叉树
int choice;
do{
printf("\n1.新建学生健康表\n");
printf("2.向学生健康表插入学生信息\n");
printf("3.从文件中读取健康表信息\n");
printf("4.向文件写入学生健康表信息\n");
printf("5.在健康表中查询学生信息\n");
printf("6.在屏幕中输出全部学生信息\n");
printf("7.退出\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch(choice){
case 1: create(&root); break;
case 2: insert(&root); break;
case 3: read_file(&root); break;
case 4: write_file(root); break;
case 5: search(root); break;
case 6: output(root); break;
case 7: destroy(root); exit(0); break;
default: printf("输入错误,请重新输入!\n"); break;
}
}while(1);
return 0;
}
/*新建学生健康表*/
void create(Tree *root){
printf("\n新建学生健康表\n");
*root = NULL; //初始化二叉树
printf("新建成功!\n");
}
/*向学生健康表插入学生信息*/
void insert(Tree *root){
printf("\n向学生健康表插入学生信息\n");
Student stu;
printf("请输入学号:");
scanf("%s", stu.id);
printf("请输入姓名:");
scanf("%s", stu.name);
printf("请输入出生日期:");
scanf("%s", stu.birth);
printf("请输入性别:");
scanf("%s", stu.gender);
printf("请输入身体状况:");
scanf("%s", stu.health);
Node *p = (Node*)malloc(sizeof(Node));
p->data = stu;
p->left = p->right = NULL;
if(*root == NULL){ //若二叉树为空,则直接插入
*root = p;
}
else{ //否则按学号大小插入
Node *q = *root;
while(q != NULL){
if(strcmp(stu.id, q->data.id) < 0){
if(q->left == NULL){
q->left = p;
printf("插入成功!\n");
return;
}
else{
q = q->left;
}
}
else if(strcmp(stu.id, q->data.id) > 0){
if(q->right == NULL){
q->right = p;
printf("插入成功!\n");
return;
}
else{
q = q->right;
}
}
else{ //学号相同时提示插入失败
printf("插入失败,学号已存在!\n");
return;
}
}
}
}
/*从文件中读取健康表信息*/
void read_file(Tree *root){
printf("\n从文件中读取健康表信息\n");
FILE *fp = fopen("health.dat", "rb");
if(fp == NULL){ //文件不存在时提示读取失败
printf("读取失败,文件不存在!\n");
return;
}
Student stu;
while(fread(&stu, sizeof(Student), 1, fp) == 1){ //按照结构体大小读取文件内容
Node *p = (Node*)malloc(sizeof(Node));
p->data = stu;
p->left = p->right = NULL;
if(*root == NULL){ //若二叉树为空,则直接插入
*root = p;
}
else{ //否则按学号大小插入
Node *q = *root;
while(q != NULL){
if(strcmp(stu.id, q->data.id) < 0){
if(q->left == NULL){
q->left = p;
break;
}
else{
q = q->left;
}
}
else if(strcmp(stu.id, q->data.id) > 0){
if(q->right == NULL){
q->right = p;
break;
}
else{
q = q->right;
}
}
else{ //学号相同时提示插入失败
break;
}
}
}
}
fclose(fp);
printf("读取成功!\n");
}
/*向文件写入学生健康表信息*/
void write_file(Tree root){
printf("\n向文件写入学生健康表信息\n");
FILE *fp = fopen("health.dat", "wb");
if(fp == NULL){ //文件打开失败时提示写入失败
printf("写入失败,文件打开失败!\n");
return;
}
fwrite(root, sizeof(Student), 1, fp); //按照结构体大小写入文件内容
fclose(fp);
printf("写入成功!\n");
}
/*在健康表中查询学生信息*/
void search(Tree root){
printf("\n在健康表中查询学生信息\n");
char id[20];
printf("请输入要查询的学号:");
scanf("%s", id);
Node *p = root;
while(p != NULL){
if(strcmp(id, p->data.id) < 0){
p = p->left;
}
else if(strcmp(id, p->data.id) > 0){
p = p->right;
}
else{
printf("学号\t姓名\t出生日期\t性别\t身体状况\n");
printf("%s\t%s\t%s\t%s\t%s\n", p->data.id, p->data.name, p->data.birth, p->data.gender, p->data.health);
return;
}
}
printf("查询失败,未找到该学号!\n");
}
/*在屏幕中输出全部学生信息*/
void output(Tree root){
printf("\n在屏幕中输出全部学生信息\n");
printf("学号\t姓名\t出生日期\t性别\t身体状况\n");
if(root == NULL){
printf("健康表为空!\n");
return;
}
void inorder(Tree root); //中序遍历二叉树
inorder(root);
}
/*中序遍历二叉树*/
void inorder(Tree root){
if(root != NULL){
inorder(root->left);
printf("%s\t%s\t%s\t%s\t%s\n", root->data.id, root->data.name, root->data.birth, root->data.gender, root->data.health);
inorder(root->right);
}
}
/*销毁二叉树*/
void destroy(Tree root){
if(root != NULL){
destroy(root->left);
destroy(root->right);
free(root);
}
}
阅读全文