当前位置: 首页 > news >正文

手机网站 软件适合女生的计算机专业有哪些

手机网站 软件,适合女生的计算机专业有哪些,购买wordpress模板,上海到北京火车时刻表查询并非从0开始的c day8结构体结构体嵌套二级指针练习结构体偏移量内存对齐内存对齐的原因如何内存对齐文件操作文件的概念流的概念文本流二进制流文件缓冲区文件打开关闭文件关闭fclose文件读写函数回顾按格式化读写文件文件读写注意事项结构体 结构体嵌套二级指针练习 需求&am…

并非从0开始的c++ day8

  • 结构体
    • 结构体嵌套二级指针练习
    • 结构体偏移量
  • 内存对齐
    • 内存对齐的原因
    • 如何内存对齐
  • 文件操作
    • 文件的概念
    • 流的概念
      • 文本流
      • 二进制流
      • 文件缓冲区
      • 文件打开关闭
        • 文件关闭fclose
      • 文件读写函数回顾
      • 按格式化读写文件
      • 文件读写注意事项

结构体

结构体嵌套二级指针练习

需求:一个老师数组,老师设计一个结构体,需要有老师的名字和一个学生数组,学生数组可以有若干个学生

//结构体设计
struct Teacher
{//老师姓名char* name;//老师带的学生姓名数组char** students;
};void allocateSpace(struct Teacher *** teacherArray)
{if (teacherArray == NULL){return;}//堆区分配内存struct Teacher** ts = malloc(sizeof(struct Teacher*) * 3);//数据赋值//给老师分配内存for (int i = 0; i < 3; i++){//给老师分配内存ts[i] = malloc(sizeof(struct Teacher));//给老师姓名属性 分配内存ts[i]->name = malloc(sizeof(char) * 64);//给老师姓名赋值sprintf(ts[i]->name, "Teacher_%d", i+1);//给老师带领学生数组分配内存ts[i]->students = malloc(sizeof(char*) * 4);//给学生姓名分配内存 并且赋值for (int j = 0; j < 4; j++){ts[i]->students[j] = malloc(sizeof(char) * 64);sprintf(ts[i]->students[j], "%s_student_%d", ts[i]->name, j+1);}}//建立关系*teacherArray = ts;
}//打印操作
void printTeacherArray(struct Teacher ** teacherArray)
{for (int i = 0; i < 3; i++){//老师姓名printf("%s\n", teacherArray[i]->name);for(int j = 0;j<4;j++)//老师带领的学生printf("	%s\n", teacherArray[i]->students[j]);}
}//释放堆区数据
void freeSpace(struct Teacher** teacherArray)
{if (teacherArray == NULL){return;}for (int i = 0; i < 3; i++){//释放老师姓名if (teacherArray[i]->name != NULL){free(teacherArray[i]->name);teacherArray[i]->name = NULL;}//释放学生姓名for (int j = 0; j < 4; j++){if (teacherArray[i]->students[j] != NULL){free(teacherArray[i]->students[j]);teacherArray[i]->students[j] = NULL;}}//释放学生数组free(teacherArray[i]->students);teacherArray[i]->students = NULL;//释放老师free(teacherArray[i]);teacherArray[i] = NULL;}//释放老师数组free(teacherArray);teacherArray = NULL;
}void test01()
{//老师数组创建struct Teacher** teacherArray = NULL;//分配内存allocateSpace(&teacherArray);//打印所有老师和学生信息printTeacherArray(teacherArray);//释放堆区数据freeSpace(teacherArray);teacherArray = NULL;
}

牢记几个malloc对应几个free

结构体偏移量

printf(“b的偏移量:%d\n”, (int)&(p->b) - (int)p);
printf(“b的偏移量: %d\n”, offsetof(struct teacher, b));

struct  teacher
{char a;  //0 ~ 3int b;	 //4 ~ 7};void test01() 
{struct teacher t1;struct teacher* p = &t1;printf("b的偏移量:%d\n", (int)&(p->b) - (int)p);printf("b的偏移量: %d\n", offsetof(struct teacher, b));
}

通过偏移量获取数

void test02()
{struct teacher t1 = {'a',1000};struct teacher* p = &t1;printf("b的值为: %d\n", *(int*)((char*)p + offsetof(struct teacher, b)));printf("b的值为: %d\n", ((struct teacher *)((int*)p + 1))-> b);
}//结构体2
struct teacher2
{char a;int b;struct teacher c;
};void test03()
{struct teacher2  t = { 'a',10,'b',20 };int offset1 = offsetof(struct teacher2, c);int offset2 = offsetof(struct teacher, b);printf("属性c中的值为: %d\n", *(int *)((char*)&t + offset1 + offset2));printf("属性c中的值为: %d\n", *(int*)((char*)&t + offset1 + offset2));}

内存对齐

访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐

内存对齐的原因

我们知道内存的最小单元是一个字节,当CPU从内存中读取数据的时候,是一个一个字节读取

实际上cpu将内存当成多个块,每次从内存中读取一个块,这个块的大小可能是2、4、8、16等

内存对齐是操作系统为了提高访问内存的策略。操作系统在访问内存的时候,每次读取一定长度(这个长度是操作系统默认的对齐数,或者默认对齐数的整数倍)。如果没有对齐,为了访问一个变量可能产生二次访问

内存对齐优点:以空间换时间

如何内存对齐

  • 对于标准数据类型,它的地址只要是他的长度的整数倍
  • 对于非标准数据类型,比如结构体,要遵循一下对齐原则

内存对齐原则
第一个属性开始 从0开始计算偏移量
第二个属性 要放在该属性的大小 与 对齐模数比 取小的值的 整数倍上
当所有属性都计算完毕之后,整体做二次偏移,将上面计算的结构体
将上面计算的结果 扩充到 这个结构体中最大数据类型的整数倍 与对齐模数比 取小的值 的整数倍
对齐模数默认为8

#pragma pack (show)//查看对齐模数的值 默认为8
#pragma pack (1)typedef struct _STUDENT {int a;	// 0 ~ 3	//0~3char b; //4 ~ 7		//4double c;//8 ~ 15	//5~12float d;// 16 ~ 23	//13~16
}Student;void test01()
{printf("student sizeof = %d\n", sizeof(Student));
}

当嵌套结构体时,以子结构体最大数据类型的整数倍来取地址即可

typedef struct _STUDENT2 {char a;		//0 ~ 7Student b;	//8 ~ 31double c;	//32 ~ 39
}Student2;void test02()
{printf("student sizeof = %d\n", sizeof(Student2));
}

文件操作

文件的概念

通过fopen打开文件,中间还有一步open系统函数,open系统函数获取文件后,返回文件的指针FILE*给fopen

在这里插入图片描述

流的概念

C语言中,I/O操作可以简单地看做从程序移进或移出字节,这种搬运的过程称为流。I/O都是相对于程序来说,所以o输出为将字节输出到文件里,I输入为从文件读取

文本流

二进制流

我们程序中,经常看到的文本方式打开文件和二进制打开文件仅仅体现在换行符的处理上

输入/输出函数家族

家族名 目的 可用于所有流 只用于stdin和stdout
getchar 字符输入 fgetc、getc getchar
putchar 字符输出 fputc、putc putchar
gets 文本行输入 fgets gets
puts 文本行输出 fputs puts
scanf 格式化输入 fscanf scanf
printf 格式化输出 fprintf pirntf

文件缓冲区

有了缓冲区:提高硬盘寿命、提高运行效率
在这里插入图片描述
写文件时需要写fclose,因为可能有些数据留在写文件缓冲区,要是直接结束,可能会留这部分数据在里面没写进去,需要我们手动将其输出到文件

文件打开关闭

“r” 读
“w”写
“a”追加
“rb”二进制只读
“wb”二进制只写
“ab”二进制追加
“r+”允许读和写,文件必须已存在
“w+”允许读和写,如果文件不存在则创建,已存在则把文件长度截断为0字节再重新写
“a+”允许读和追加数据,如果文件不存在则创建
“rb+”以读或写方式打开一个二进制文件
“wb+”以读或写方式建立一个新的二进制文件
“ab+”以读或写方式打开一个二进制文件进行追加

文件关闭fclose

对打开文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容弄不会写到打开的文件中。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到改文件中,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件受到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区

文件读写函数回顾

  • 按照字符读写文件:fgetc(),fputc()
  • 按照行读写文件:fputs(),fgets()
  • 按照块读写文件:fread(),fwrite()
  • 按照格式化读写文件:fprintf(),fscanf()
  • 按照随机位置读写文件:fseek(),ftell(),rewind()

while ((ch = fgetc(f_read)) != EOF)
判断是否是文件尾

//按字符方式读写
void test01()
{//写文件FILE * f_write = fopen("./test1.txt", "w+");if (f_write == NULL){return;}char buf[] = "hello world";for (int i = 0; i < strlen(buf); i++){fputc(buf[i], f_write);}fclose(f_write);//读文件FILE* f_read = fopen("./test1.txt", "r");if (f_read == NULL){return;}char ch;while ((ch = fgetc(f_read)) != EOF){printf("%c", ch);}printf("\n");fclose(f_read);
}

按格式化读写文件

//移动文件光标
void test05()
{//打开文件FILE* f_write = fopen("./test5.txt", "wb");if (f_write == NULL){return;}struct Hero heros[4] ={{"geats",19},{"revice",20},{"saber",21},{"zero one",22}};for (int i = 0; i < 4; i++)//参数1 写入数据的地址  参数2 块大小  参数3 快个数  参数4 文件指针fwrite(&heros[i], sizeof(struct Hero), 1, f_write);//关闭文件fclose(f_write);//读文件FILE* f_read = fopen("./test5.txt", "rb");struct Hero temp;if (f_read == NULL){perror("文件打开失败");//errno宏 全局变量return;}//移动文件光标//fseek(f_read, sizeof(struct Hero) , SEEK_SET);fseek(f_read, -(long)sizeof(struct Hero) * 2, SEEK_END);//将文件光标置首rewind(f_read);fread(&temp, sizeof(struct Hero), 1, f_read);printf("姓名: %s 年龄:%d\n", temp.name, temp.age);fclose(f_read);
}

//参数1 写入数据的地址 参数2 块大小 参数3 快个数 参数4 文件指针
fwrite(&heros[i], sizeof(struct Hero), 1, f_write);

//移动文件光标
//fseek(f_read, sizeof(struct Hero) , SEEK_SET);
fseek(f_read, -(long)sizeof(struct Hero) * 2, SEEK_END);
前者从前往后移,后者从后往前移,后者需要强制类型转换

//将文件光标置首
rewind(f_read);

  perror("文件打开失败");//errno宏 全局变量
对于每一个错误都会有一个相应的代码

文件读写注意事项

void test01()
{//按照字符读test文件FILE* file = fopen("test.txt", "r");if (file == NULL)return;#if 0char  ch;while (!feof(file)){ch = fgetc(file);if (feof(file)){break;}printf("%c", ch);}
#endifchar ch;while ((ch = fgetc(file)) != EOF){printf("%c", ch);}fclose(file);
}
  • EOF为结尾,在if内部的代码用feof有滞后性,在文件读取结束后,还会进一次循环后再退出,if下面的代码就可以解决

  • 如果结构体中属性,创建在堆区,保存数据到文件中的时候,要将指针放入到文件中

http://www.yayakq.cn/news/678437/

相关文章:

  • 仪征市城乡建设局网站展厅设计说明100字
  • 网站导航功能凡科网站官网登录入口
  • 大型网站建设公司沈阳商城类网站建设数据库
  • 网站底部版权怎么做浏览器怎么做能不拦截网站
  • 织梦网站tel标签网站建设哪家公司好
  • 西安网站建设排行榜网站可以做二维码吗
  • 简单网站制作seo外链查询工具
  • 哪里有做网站培训的网站设计建设公司服务商
  • 网站定制公司排行榜东莞工厂网站建设
  • 网站建设 经济效益公司名被注册网站
  • 北京网页模板建站wordpress备案号显示
  • 有专门教做蛋糕的网站wordpress标签自动生成插件下载
  • 什么2007做视频网站临淄网站制作首选专家
  • 群晖做网站服务器 套件兰州网站建设优化
  • 邢台建设专业网站域名备案与网站备案
  • 上海网站快速排名公司弄个网站多少钱
  • 国外做婚纱的网站杨凌开发建设局网站
  • 制作动画软件app手机英文seo公司
  • 法律垂直问答网站怎样做app与微网站的区别
  • 新郑市网站建设安徽网站建设调查报告
  • 对网站建设有什么样好的建设意见wordpress悬浮目录
  • 电子商务网站建设应用淮南网官方网站
  • 做标书要不要做网站php房产中介网站源码
  • 微信小程序商城怎么开通360网站seo怎么做
  • 个人网站建设赚取流量费郑州网络公司排名
  • 中国建材网官方网站二环建设部网站
  • 长春网站建设制作联合智慧旅游建设旅游门户网站
  • 徐水区城市建设网站wordpress图片标注插件下载
  • 网站建设行业细分网站免费域名申请
  • 不备案的网站的稳定吗ui设计职业培训机构