内容简介:输出结果为:根据上面代码可得出结论:例如:
不同类型的变量共同占用一段内存(相互覆盖),联合变量任何时刻只有一个成员存在,节省内存
2、大小
联合体变量的大小=最大的成员所占的字节数
union MyValue{ int x; int y; double z; }; void main(){ union MyValue d1; d1.x = 90; d1.y = 100; printf("%d,%d,%lf\n",d1.x,d1.y,d1.z); d1.z = 25.8; printf("%d,%d,%lf\n",d1.x,d1.y,d1.z); getchar(); }
输出结果为:
100,100,-92559592117433135502616407313071917486139351398276445610442752.000000 -858993459,-858993459,25.800000
根据上面代码可得出结论: 在联合体中,最后一次赋值有效
二、枚举
1、定义
“枚举”就是把可能的值(固定的数据)一一的列举出来,变量的值只限于列举出来的值的范围
例如:
enum Day{ Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; void main(){ enum Day d = Wednesday; printf("Today is %d,%#x\n",d,&d); getchar(); }
三、IO操作
1、读取文本文件
读取文件的方法为:
FILE fopen(char path,char * model)
void main(){ char path[] = "D:\\test.txt"; //打开 FILE *fp = fopen(path,"r"); if(fp == NULL){ printf("文件打开失败...\n"); return; } //读取 char buff[50];//缓冲 while(fgets(buff,50,fp)){ printf("%s",buff); } //关闭 fclose(fp); getchar(); }
2、写入文本文件
写入文件的方法为:
fputs(char text,FILE _file)
void main(){ char path[] = "D:\\test_new.txt"; //打开 FILE *fp = fopen(path,"w"); if(fp == NULL){ printf("文件打开失败...\n"); return; } //写入 char *text = "How are you?\nI am fine,Thank You!"; fputs(text,fp); //关闭 fclose(fp); getchar(); }
3、操作二进制文件
-
计算机的文件存储在物理上都是二进制;文本文件和二进制之分,其实是一个逻辑之分
-
C读写文本文件与二进制文件的差别仅仅体现在回车换行符
-
写文本时,每遇到一个’\n’,会将其转换成’\r\n’,(回车换行)
- 读文本时,每遇到一个’\r\n’,会将其转换成’\n’
size_t fread ( void ptr, size_t size, size_t count, FILE stream );
参数:
-
ptr :
指向大小至少为(size count)个字节的内存块的指针,转换为void 。 -
size :
要读取的每个元素的大小(以字节为单位)。
size_t是无符号整数类型。 -
count :
元素数量,每个元素的大小为字节大小。
size_t是无符号整数类型。 -
stream:
指向指定输入流的FILE对象的指针。
size_t fwrite ( const void ptr, size_t size, size_t count, FILE stream );
参数:
-
ptr :
指向大小至少为(size count)个字节的内存块的指针,转换为void 。 -
size :
要读取的每个元素的大小(以字节为单位)。
size_t是无符号整数类型。 -
count :
元素数量,每个元素的大小为字节大小。
size_t是无符号整数类型。 -
stream:
指向指定输入流的FILE对象的指针。
void main(){ char read_path[] = "D:\\avatar.jpg"; char write_path[] = "D:\\avatar_new.jpg"; //读的文件,b字符表示操作二进制文件(binary) FILE *read_fp = fopen(read_path,"rb"); //写的文件 FILE *write_fp = fopen(write_path,"wb");; //复制 int buff[50];//缓冲区域 int len = 0;//每次读到的内容的长度 while((len = fread(buff,sizeof(int),50,read_fp))!=0){ //将读取到的内容写入新文件 fwrite(buff,sizeof(int),50,write_fp); } //关闭 fclose(read_fp); fclose(write_fp); getchar(); }
4、获取文件的大小
重新定位文件指针:
int fseek ( FILE * stream, long int offset, int origin );
参数:
-
stream:
指向标识流的FILE对象的指针。 -
offset:
二进制文件:从原点偏移的字节数。
文本文件:零或ftell返回的值 -
origin:
位置用作偏移的参考。 它由中定义的以下常量之一指定,专门用作此函数的参数:
Constant | Reference position |
---|---|
SEEK_SET | 文件开头 |
SEEK_CUR | 文件指针的当前位置 |
SEEK_END | 文件结束 |
*允许库实现无意义地支持SEEK_END(因此,使用它的代码没有真正的标准可移植性)。
返回当前的文件指针,相对于文件开头的位移量:
long ftell ( FILE * stream);
void main(){ char read_path[] = "D:\\avatar.jpg"; FILE *fp = fopen(read_path,"r"); //重新定位文件指针 fseek(fp,0,SEEK_END); //返回当前的文件指针,相对于文件开头的位移量 long filesize = ftell(fp); printf("filesize = %d\n",filesize); getchar(); }
5、文本文件的加密解密
//加密 void crpypt(char normal_path[], char crypt_path[]) { //打开文件 FILE *normal_fp = fopen(normal_path, "r"); FILE *crypt_fp = fopen(crypt_path, "w"); //一次读取一个字符 int ch; while ((ch = fgetc(normal_fp)) != EOF) {//End of FILE //加密 fputc(ch ^ 9, crypt_fp); } fclose(normal_fp); fclose(crypt_fp); } //解密 void decrpypt(char crypt_path[], char decrpypt_path[]) { //打开文件 FILE *crypt_fp = fopen(crypt_path, "r"); FILE *decrpypt_fp = fopen(decrpypt_path, "w"); //一次读取一个字符 int ch; while ((ch = fgetc(crypt_fp)) != EOF) {//End of FILE //加密 fputc(ch ^ 9, decrpypt_fp); } fclose(crypt_fp); fclose(decrpypt_fp); } void main() { char normal_path[] = "D:\\test.txt"; char crypt_path[] = "D:\\test_crypt.txt"; char decrypt_path[] = "D:\\test_decrypt.txt"; crpypt(normal_path, crypt_path); decrpypt(crypt_path, decrypt_path); getchar(); }
6、二进制文件的加密解密
读取二进制文件中的数据时,一个一个字符读取
密码:qazwsx
//加密 void crpypt(char normal_path[], char crypt_path[], char password[]) { //打开文件 FILE *normal_fp = fopen(normal_path, "rb"); FILE *crypt_fp = fopen(crypt_path, "wb"); //一次读取一个字符 int ch; int i = 0; int pwd_len = strlen(password); while ((ch = fgetc(normal_fp)) != EOF) {//End of FILE //加密 fputc(ch ^ password[i % pwd_len], crypt_fp); i++; } fclose(normal_fp); fclose(crypt_fp); } //解密 void decrpypt(char crypt_path[], char decrpypt_path[], char password[]) { //打开文件 FILE *crypt_fp = fopen(crypt_path, "rb"); FILE *decrpypt_fp = fopen(decrpypt_path, "wb"); //一次读取一个字符 int ch; int i = 0; int pwd_len = strlen(password); while ((ch = fgetc(crypt_fp)) != EOF) {//End of FILE //加密 fputc(ch ^ password[i % pwd_len], decrpypt_fp); i++; } fclose(crypt_fp); fclose(decrpypt_fp); } void main() { char password[] ="qazwsx"; char normal_path[] = "D:\\avatar.jpg"; char crypt_path[] = "D:\\avatar_crypt.jpg"; char decrypt_path[] = "D:\\avatar_decrypt.jpg"; crpypt(normal_path, crypt_path,password); decrpypt(crypt_path, decrypt_path,password); getchar(); }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- c# – 枚举时项目发生变化时是否会影响枚举?
- 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
- 测者的JUnit单元测试探坑记:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
- c# – 循环枚举类型
- Python 的枚举类型
- 枚举的使用示例
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
国际游戏设计全教程
[美]迈克尔·萨蒙德 / 张然、赵嫣 / 中国青年出版社 / 2017-2 / 108.00元
你想成为一名电子游戏设计师吗?想知道《肯塔基0号路》《到家》《枪口》等独立游戏的制作理念及过程吗?想了解《戈莫布偶大冒险》《辐射3》《战争机器》中关卡设计的奥秘吗?本书用通俗易懂的文字介绍了在游戏开发与策划过程中,需要掌握的游戏设计原理和制作的基础知识,可以作为读者从“构思一个电子游戏”到“真正完成一个电子游戏”的完备指南。 本书以系统的游戏设计流程结合大量优秀的游戏设计案例进行讲解,让读者......一起来看看 《国际游戏设计全教程》 这本书的介绍吧!
XML 在线格式化
在线 XML 格式化压缩工具
UNIX 时间戳转换
UNIX 时间戳转换