入门
- 1. 流程控制基本概念
- 2. 流程控制 选择结构
- 3. 流程控制 循环结构
- 4. 四大跳转
- 5. 循环的嵌套
- 6. C 语言图形打印练习
- 7. 函数那点事
- 8. main 函数分析
- 9. 递归函数
- 10. 进制基本概念
- 11. 进制转换
- 12. 原码反码补码
- 13. 位运算符
- 14. 变量内存分析
- 15. Char 类型内存存储细节
- 16. 类型说明符详解
- 17. 数组那点事
- 18. 数组内部存储细节
- 19. 数组注意事项
- 20. 数组和函数
基础
- 1. 计算机常识
- 2. 什么是计算机程序
- 3. 什么是计算机语言
- 4. 常见的计算机语言类型有哪些
- 5. 什么是C语言
- 6. C语言发展历史
- 7. C语言标准
- 8. C语言现状
- 9. 为什么要学习C语言
- 10. 如何学好C语言
- 11. 编写C语言程序用什么工具
- 12. 什么是 QtCreator
- 13. 什么是环境变量
- 14. 如何创建C语言程序
- 15. C语言程序组成
- 16. 函数定义格式
- 17. 如何运行编写好的程序
- 18. C语言程序练习
- 19. 初学者如何避免程序出现 BUG
- 20. 多语言对比
- 21. 注释就是这么简单
- 22. 什么是关键字
- 23. 什么是标识符
- 24. 什么是数据
- 25. C语言数据类型
- 26. 什么是常量
- 27. C语言变量那点事
- 28. printf 函数
- 29. Scanf 函数
- 30. putchar 和 getchar
- 31. C语言运算符大全解
- 32. 阶段练习
进阶
- 1. 计数排序
- 2. 选择排序
- 3. 冒泡排序
- 4. 插入排序
- 5. 希尔排序
- 6. 折半查找
- 8. 二维数组那点事
- 9. 二维数组的遍历和存储
- 10. 二维数组与函数
- 11. 二维数组练习
- 12. 字符串的基本概念
- 13. 字符串常用方法
- 14. 字符串练习
- 15. 指针的基本概念
- 16. 指针变量那点事
- 17. 访问指针所指向的存储空间
- 18. 指针类型与二级指针
- 19. 数组指针的概念及定义
- 20. 指针与字符串
- 21. 指向函数指针
- 22. 结构体详解
- 23. 结构体数组
- 24. 结构体指针
- 25. 结构体内存分析
- 26. 结构体变量占用存储空间大小
- 27. 结构体嵌套定义
- 28. 共用体
- 29. 枚举
- 30. 全局变量和局部变量
- 31. 关键字
- 32. static 与 extern 对函数的作用
- 33. QtCreator 编译过程做了什么
- 34. 计算机运算过程分析
- 35. 预处理指令与宏定义
- 36. 条件编译
- 37. typedef 关键字
- 38. 宏定义与函数以及 typedef 区别
- 39. const 关键字
- 40. 内存管理
- 41. malloc 函数
- 42. free 函数
- 43. calloc 函数
- 44. realloc 函数
- 45. 链表与静态链表
- 46. 动态链表
- 47. 链表销毁与长度计算
- 48. 链表查找与删除
- 49. 文件基本概念
- 50. 文件的打开与关闭
- 51. 读写结构体
- 52. 文件操作函数
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
51. 读写结构体
读写结构体
- 结构体中的数据类型不统一,此时最适合用二进制的方式进行读写
- 读写单个结构体
#include <stdio.h>
typedef struct{
char *name;
int age;
double height;
} Person;
int main()
{
Person p1 = {"lnj", 35, 1.88};
// printf("name = %s\n", p1.name);
// printf("age = %i\n", p1.age);
// printf("height = %lf\n", p1.height);
FILE *fp = fopen("person.stu", "wb+");
fwrite(&p1, sizeof(p1), 1, fp);
rewind(fp);
Person p2;
fread(&p2, sizeof(p2), 1, fp);
printf("name = %s\n", p2.name);
printf("age = %i\n", p2.age);
printf("height = %lf\n", p2.height);
return 0;
}
- 读写结构体数组
#include <stdio.h>
typedef struct{
char *name;
int age;
double height;
} Person;
int main()
{
Person ps[] = {
{"zs", 18, 1.65},
{"ls", 21, 1.88},
{"ww", 33, 1.9}
};
FILE *fp = fopen("person.stu", "wb+");
fwrite(&ps, sizeof(ps), 1, fp);
rewind(fp);
Person p;
while(fread(&p, sizeof(p), 1, fp) > 0){
printf("name = %s\n", p.name);
printf("age = %i\n", p.age);
printf("height = %lf\n", p.height);
}
return 0;
}
- 读写结构体链表
#include <stdio.h>
#include <stdlib.h>
typedef struct person{
char *name;
int age;
double height;
struct person* next;
} Person;
Person *createEmpty();
void insertNode(Person *head, char *name, int age, double height);
void printfList(Person *head);
int saveList(Person *head, char *name);
Person *loadList(char *name);
int main()
{
// Person *head = createEmpty();
// insertNode(head, "zs", 18, 1.9);
// insertNode(head, "ls", 22, 1.65);
// insertNode(head, "ws", 31, 1.78);
// printfList(head);
// saveList(head, "person.list");
Person *head = loadList("person.list");
printfList(head);
return 0;
}
/**
* @brief loadList 从文件加载链表
* @param name 文件名称
* @return 加载好的链表头指针
*/
Person *loadList(char *name){
// 1.打开文件
FILE *fp = fopen(name, "rb+");
if(fp == NULL){
return NULL;
}
// 2.创建一个空链表
Person *head = createEmpty();
// 3.创建一个节点
Person *node = (Person *)malloc(sizeof(Person));
while(fread(node, sizeof(Person), 1, fp) > 0){
// 3.进行插入
// 3.1让新节点的下一个节点 等于 头节点的下一个节点
node->next = head->next;
// 3.2让头结点的下一个节点 等于 新节点
head->next = node;
// 给下一个节点申请空间
node = (Person *)malloc(sizeof(Person));
}
// 释放多余的节点空间
free(node);
fclose(fp);
return head;
}
/**
* @brief saveList 存储链表到文件
* @param head 链表头指针
* @param name 存储的文件名称
* @return 是否存储成功 -1失败 0成功
*/
int saveList(Person *head, char *name){
// 1.打开文件
FILE *fp = fopen(name, "wb+");
if(fp == NULL){
return -1;
}
// 2.取出头节点的下一个节点
Person *cur = head->next;
// 3.将所有有效节点保存到文件中
while(cur != NULL){
fwrite(cur, sizeof(Person), 1, fp);
cur = cur->next;
}
fclose(fp);
return 0;
}
/**
* @brief printfList 遍历链表
* @param head 链表的头指针
*/
void printfList(Person *head){
// 1.取出头节点的下一个节点
Person *cur = head->next;
// 2.判断是否为NULL, 如果不为NULL就开始遍历
while(cur != NULL){
// 2.1取出当前节点的数据, 打印
printf("name = %s\n", cur->name);
printf("age = %i\n", cur->age);
printf("height = %lf\n", cur->height);
printf("next = %x\n", cur->next);
printf("-----------\n");
// 2.2让当前节点往后移动
cur = cur->next;
}
}
/**
* @brief insertNode 插入新的节点
* @param head 链表的头指针
* @param p 需要插入的结构体
*/
void insertNode(Person *head, char *name, int age, double height){
// 1.创建一个新的节点
Person *node = (Person *)malloc(sizeof(Person));
// 2.将数据保存到新节点中
node->name = name;
node->age = age;
node->height = height;
// 3.进行插入
// 3.1让新节点的下一个节点 等于 头节点的下一个节点
node->next = head->next;
// 3.2让头结点的下一个节点 等于 新节点
head->next = node;
}
/**
* @brief createEmpty 创建一个空链表
* @return 链表头指针, 创建失败返回NULL
*/
Person *createEmpty(){
// 1.定义头指针
Person *head = NULL;
// 2.创建一个空节点, 并且赋值给头指针
head = (Person *)malloc(sizeof(Person));
if(head == NULL){
return head;
}
head->next = NULL;
// 3.返回头指针
return head;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论