IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c语言】复习无止境,day5--头文件&结构体&文件读写篇【end】 -> 正文阅读

[C++知识库]【c语言】复习无止境,day5--头文件&结构体&文件读写篇【end】

头文件中应该写什么

面临的问题:头文件可能被任何源文件包含,意味着头文件中的内容会在多个目标文件中存在,合并不能冲突
重点:头文件中只能编写声明语句,不能有定义语句
全局变量的声明 extern
函数的声明
宏常量
宏函数
typedef 类型重定义
结构、联合、枚举的类型的声明

头文件的编写规则:
1、为每个.c文件写一份.h文件,因为.h文件是对.c文件的说明
2、如果需要用到某个.c文件中的变量、函数、宏,只需要把它的头文件导入即可。
3、.c文件也要导入它的.h 目的是为了让声明与定义一致

头文件重复包含:
解决方案:添加头文件卫士

头文件之间的相互包含:
假如a.h包含了b.h,b.h又需要包含a.h,这种情况就会编译错误
解决方案:把a.h中需要的内容 和 b.h中需要的内容提取出来,编写成一个c.h

错误:未知的类型名‘xxxx’ 一般都是头文件之间相互包含导致的(复制粘贴头文件也可能导致)

结构:
结构是一种由程序员自己设计的数据类型,用于描述一个事物的各项数据的,由若干个不同的基础数据类型组成

设计:
struct 结构体名
{
类型 成员名;

};

定义结构变量:
struct 结构体名 结构体变量名;
注意:c语言中,在定义结构体变量时,struct不能省略

定义结构变量并初始化:
struct 结构体名 结构体变量名 = {v1,v2,v3…};
必须按照结构成员设计顺序来初始化

struct 结构体名 结构体变量名 = {.成员名=v1,.成员名=v2…};
只初始化某个成员,不用关注顺序

注意:同类型的结构变量可以直接赋值。
struct Student stu1,stu2;
stu1 = stu2;

访问成员:
结构体变量名.成员名;
结构指针->成员名;

练习:设计一个教师结构体,成员有:姓名、性别、工号、工龄,定义一个教师结构体变量,使用scanf输入各个成员的值,并显示

结构体变量作为形参时:
由于结构体变量的字节数都比较大,值传递的效率比较低,因此都是传递结构变量的地址,如果不需要修改结构变量值,可以使用const保护

   	 	typedef 重定义结构类型
        typedef struct 结构名 结构名;
        之后就不需要使用struct关键字了

   		typedef struct 结构名
        {
            类型 成员名;
            ...
        }结构名;

注意:一般结构体变量存放在堆内存

如何计算结构体的字节数:
结构体成员的顺序会影响它的总字节数,在设计结构体时如果成员的顺序合理安排,可以大大节约内存
内存对齐:
假定第一个成员从零地址开始,存储每个成员的地址编号必须能够被它的字节数整除,如果不能整除则填充空字节
内存补齐:
结构体的总字节数,必须是它最大字节成员的整数倍,如果不是则在末尾填充空字节

注意:在Linux系统下结算结构体的对齐和补齐时,如果最大成员的字节数超过4字节,则按照4字节计算,在windows系统按照实际情况计算

#pragma pack(n)
设置对齐、补齐的最大字节数, n<=默认 (1,2,4)

联合:union
联合与结构的使用方法基本一致,与结构的区别是所有成员共用一块内存,一个成员的值发生改变,其他成员的值都随之改变。
联合就是用少量的内存对应多个标识符,从而达到节约内存的目的,但是现在基本不再使用
联合常考的笔试题:
union Data
{
char ch[5];
int num;
}
注意:计算联合的字节数时,要考虑内存补齐

如何判断系统是大端还是小端?
假如有一个十六进制数 0x01020304 存储在以0x0A为起始的4字节内存中

    	高位数据存储在高位地址:小端系统 (0A:04 0B:03 0C:02 0D:01)
        高位数据存储在低位地址:大端系统 (0A:01 0B:02 0C:03 0D:04)

个人计算机都是小端系统,而UNIX服务器和网络设备都是大端,网络字节序也是大端模式的数据

枚举:enum
枚举就是一种数据类型,把可能出现的值全部罗列出来,取一个有意义的名字,除此之外,该类型的变量再等于其它数值就是非法的(愿望) g++编译器会限制

枚举可以看成是值受限的int类型,但是编译器为了效率并不去检查,所以在C语言中枚举也可以当做int类型变量使用

   enum Direction {UP=183,DOWN=184,RIGHT=185,LEFT=186};

如果不给成员值,枚举常量的值默认从0开始,逐渐+1,如果给某个枚举常量设置值,后面的会在它的基础上逐渐+1

文件的分类:
文本文件: 存储的是ASCII码的二进制(人能看懂的文件) ‘2’‘5’‘5’
二进制文件: 存储的是数据的补码 1111 1111 ->255

文件IO:

  FILE *fopen(const char *path, const char *mode);
    功能:打开或创建文件
    path:文件的路径
    mode:打开模式
        r      以只读权限打开文件,如果不存在则打开失败
        r+     在r的基础上增加写权限
        w      以只写权限打开文件,如果文件不存在则新建,如果文件存在则清空
        w+     在w的基础上增加读权限
        a      以只写权限打开文件,如果文件不存在则新建,如果文件存在则不清空,新写入的数据会在末尾
        a+     在a的基础上增加读权限
    返回值:结构指针,不需要关心它的成员,只需要知道它是操作文件的凭证,失败返回NULL

二进制方式读写:

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:把内存中的数据写入到文件中
ptr:内存首地址
size:一次写多少个字节
nmemb:写入多少次
stream:文件指针,fopen的返回值
返回值:成功写入的次数
   size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:从文件中读取数据到内存中
    ptr:内存首地址
    size:一次读取多少字节
    nmemb:读取多少次
    stram:文件指针,fopen的返回值
    返回值:成功读取到的次数

练习1:定义一个教师结构体并初始化一个教师结构体变量,以二进制形式写入到文件中
练习2:从文件中读取教师结构体变量并打印

文本方式读写:

		int fprintf(FILE *stream, const char *format, ...);
		功能:以文本形式写入数据到文件中
		stream:要写入的文件指针
		format:"文本+占位符"
		...: 变量名
		返回值:成功写入的字节数
	   int fscanf(FILE *stream, const char *format, ...);
	    功能:从文件中读取数据到变量中
	    stream:要读取的文件指针
	    format:"文本+占位符"
	    ...:变量名地址
	    返回值:成功读取到的变量的个数
	   int fclose(FILE *fp);
	    功能:关闭文件

练习3:定义一个教师结构体并初始化一个教师结构体变量,以文本形式写入到文件中
练习4:从文件中以文本形式读取教师结构体变量并打印

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 00:18:01  更:2021-07-14 00:18:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 2:26:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码