首页 > 其他分享 >c语言学习10

c语言学习10

时间:2023-08-01 21:14:31浏览次数:31  
标签:10 语言 stream 文件 int 成员 字节数 学习 结构

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

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

定义:
    struct 结构体类型名 结构体变量名;
    注意:C语言中在定义结构变量时,struct关键字不能省略

初始化:
    struct 结构体类型名 结构体变量名 = {v1,v2,v3,...};
        注意:必须根据成员的设计顺序初始化
    
    struct 结构体类型名 结构体变量名 = {.成员名1=v1,.成员名2=v2,...};
        注意:不需要按照顺序,只初始化某些成员
    
    struct 结构体类型名 结构体变量名 = 同类型结构变量;
        注意:同类型的结构变量可以直接整体赋值

访问成员:
    结构体变量名.成员名;

    结构体指针->成员名;
    注意:由于结构体变量一般字节数都较大,普通值传递效率较低,因此一般都传递结构变量的地址
        存储结构变量一般存在堆内存比较合适

typedef重定义结构类型:
typedef struct 结构类型 结构类型;
typedef struct 结构类型
{

    }结构类型;

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

    在Linux系统中,计算结构体的对齐和补齐时,如果成员的类型字节数超过4,则按照4字节算
    例子:
        struct Person {
        char name[20];   // 20字节
        int age;         // 4字节
        float height;    // 4字节
        };  //根据对齐补齐的话,应该占28个字节,在表示每个成员的地址编号必须能被该成员类型字节数整除时,数组的类型取决于前面定义的类型,不需要算上数组数目,但是在计算字节时要算上,并且是连续的

    在Windows中,会根据实际字节数计算

    #pragma pack(n) 设置对齐、补齐的最大字节数,在Linux中只有 1 和 2 有效果

联合: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服务器和网络设备都是大端
因此本地数据(本地字节序)(也就是小端)传输到网络设备(网络字节序)时需要进行转换,该转换称为序列化和反序列化(Json\xml)
168 "168" sprintf sscanf

枚举:enum
枚举类型是希望把一种类型可能出现的所有的值罗列出来,并取一个有意义的名字表示,除此之外,该类型的值如果是其它值则非法
注意:gcc不检查是否非法,g++检查
可以把枚举当做值受限的int类型,但是gcc编译器不检查
注意:如果枚举成员不赋值,成员的值默认从0开始,逐渐+1,如果某个成员设置了值,后续的成员在它的基础上逐渐+1

枚举常量与宏定义的区别:
1、枚举常量需要占用内存,而定义宏常量不占用内存
2、枚举常量的设计目的是为了限制实际数据输入、定义宏是为了完成代码的替换和维护
3、枚举常量是具有类型,宏定义没有类型

文件的分类:
文本文件:是人能看得懂的文件,存储的是字符符号的ASCII码的二进制 '2' '5' '5'
二进制文件:存储的是数据的补码二进制
255 1111 1111

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

二进制方式读写文件:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:把一段内存数据写入到文件中
ptr:待写入的内存首地址
size:一次写入的字节数
nmemb:写入多少次
stream:文件指针,fopen的返回值
返回值:成功写入的次数
以文本方式读写:
int fprintf(FILE *stream, const char *format, ...);
功能:以文本形式写入数据到文件中
stream:要写入的文件
format:"提示信息+占位符"
...:变量名列表
返回值:成功写入的字符数

int fscanf(FILE *stream, const char *format, ...);
功能:从文件中读取数据到变量中
stream:要读取的文件
format:"提示信息+占位符"
...:变量地址列表
返回值:成功读取的变量个数

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

int fclose(FILE *stream);
功能:关闭文件 
注意:文件读写有有缓冲区机制,想要立即写入,需要关闭文件后才能看到

文件位置指针:
每个打开的文件都有一个指针记录这读写操作的位置,它会随着读写函数的执行而自动移动,所以以r、r+、w、w+方式打开文件位置指针默认在文件开头,以a、a+方式打开文件位置指针默认在文件末尾
平时顺序读写时不用关注位置指针,当需要随机读写文件时可以通过手动设置文件指针的位置来进行
int fseek(FILE *stream, long offset, int whence);
功能:设置文件位置指针的位置
stream:要设置的文件
offset:偏移值
whence:基础位置
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
返回值:成功返回0,失败返回-1

void rewind(FILE *stream);
功能:把文件位置指针设置到文件开头

long ftell(FILE *stream);
功能:获取文件位置指针的位置
返回值:位置指针在第几字节

char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取一行长度为size-1的字符串到s

int fputs(const char *s, FILE *stream);
功能:写入一个字符串到文件中,会自动在末尾添加 '\n'
返回值:成功写入的字符个数

int remove(const char *pathname);
功能:删除文件
pathname:建议写绝对路径
返回值:成功返回0,失败返回-1 

int rename(const char *oldpath, const char *newpath);
功能:重命名文件
返回值:成功返回0,失败返回-1

main函数参数:
也叫命令行参数
argc:代表了命令行提供的参数个数 ./a.out 也算一个
argv:按顺序以字符串形式存储每个命令行参数

标签:10,语言,stream,文件,int,成员,字节数,学习,结构
From: https://www.cnblogs.com/c-learnmore/p/17599093.html

相关文章

  • 禁用Win10更新,禁用Win11更新,更彻底的关闭系统更新
    新建一个bat文件填充以下内容::WindowsauomaticupdatesregaddHKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU/vAutoInstallMinorUpdates/tREG_DWORD/d1/fregaddHKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU/vNoAutoUpda......
  • 初学C语言day07--指针与堆内存
    什么是指针:指针是一种特殊的数据类型,使用它可以定义指针变量,指针变量中存储的是整形数据,该整型数据代表了内存的编号(地址),可以通过这个编号访问对应的内存为什么要使用指针:1、函数之间是相互独立的,但是有时候需要共享变量传参是单向值传递全局变量可以共享,但是容易命名冲突......
  • 20230801 数论基础学习笔记
    理论基础中国剩余定理及拓展已知\(x\equiva_i(\bmodp_i\)\),求\(x\bmod\operatorname{lcm}\{p_i\}\)的值。若\(p_i\)互质,那么我们只需要计算\(c_i\)使得\[\prod\limits_{j\nei}\cdotc_i\bmodp_i=1\]然后有\[x=\sum\limits_{i}c_ia_i\prod\limits......
  • 使用 Go 语言实现二叉搜索树
    原文链接:使用Go语言实现二叉搜索树二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。它有很多变种,比如红黑树,常被用作std::map和std::set的底层实现;B树和B+树,广泛应用于数据库系统中。本文要介绍的二叉搜索树用的也很多,比如在开源项目go-z......
  • C语言
    程序设计和C语言C语言的特点C语言语句简洁紧凑使用方便灵活运算符丰富表达能力强//c语言只有32个关键字34种运算符C语言程序可移植性好//C语言中没有直接依赖硬件的语句与硬件有关的操作如数据的输入、输出都是都是调用系统提供的库函数//来实现的而这些库函数本身并......
  • Java学习-2
    今天稍微刷了几道算法题,整理便于之后复习.1.计算小于n的所有质数的个数。classSolution{publicintcountPrimes(intn){boolean[]arr=newboolean[n];intcnt=0;for(inti=2;i<n;i++){if(arr[i])continue;cnt+=......
  • AIGC学习-1
    挖坑,闲的没事可以去部署这个项目玩玩:AI入门必修,跟着阿里云专家搭建文生图应用(aliyun.com)玩转AIGC|使用阿里云NAS+PAI-EAS部署StableDiffusion文生图模型-阿里云开发者社区(aliyun.com)......
  • pytest学习
    pytest参考https://blog.csdn.net/stetstet/article/details/119221464https://blog.csdn.net/lovedingd/article/details/98952868示例最简单的示例类级别的示例运行方式main方式运行importpytestif__name__=="__main__":## pytest.main(['-s','test_exampl......
  • C语言循环语句
     当if没有花括号时,将只会执行if条件语句下第一个分号前的语句,下一个分号前的是另一个执行语句。 逻辑与&&:括号内的所有条件必须都满足  逻辑或||“:括号内的条件只需要满足一个即可   if括号内表达式和优先级: 括号优先级最高,再计算加减乘除,最后是比较  进......
  • beautifulsoup学习记录
    BeautifulSoup库总结1、BeautifulSoup库作用2、BeautifulSoup()方法3、find()、find_all()、selector()、get()方法1、BeautifulSoup库作用用于将爬取到的网页源码(用requests库完成)解析为soup文档,这样做的好处是可以再用BeautifulSoup库中的过滤函数(方法)过滤提取......