C语言知识点 -- 动态内存管理、文件操作
C语言知识点 – 动态内存管理、文件操作
文章目录
- C语言知识点 -- 动态内存管理、文件操作
- 一、动态内存管理
- 1.malloc
- 2.free
- 3.calloc
- 4.realloc
- 二、文件操作
- 1.文件指针
- 2.文件的打开和关闭
- 3.文件的顺序读写
- 4.文件的随机读写
- 5.文件读取结束的判定
- 6.文件缓冲区
一、动态内存管理
1.malloc
向内存申请一块连续的空间,并返回指向这块空间的指针;
1.若开辟成功,则返回一个指向这块空间的地址;
若开辟失败,则返回空指针NULL,因此malloc返回的值一定要做检查;
2.返回类型是void*,使用者需自己决定返回空间的数据类型;
2.free
用来释放动态内存开辟的空间。
int main()
{int* ptr = (int*)malloc(40);//在堆区开辟一块40字节的空间,并以整形的格式来管理int* p = ptr;if (NULL == p){perror("malloc");return 1;}int i = 0;for (i = 0; i < 10; i++){*p = i;p++;}free(ptr);//释放在ptr处开辟的空间ptr = NULL;//ptr要赋值空指针,不然会成野指针return 0;
}
3.calloc
申请一块连续的内存空间,并且会初始化;
为num个大小为size的元素开辟一块空间,并将每个字节都初始化为0;
int main()
{int* p = (int*)calloc(10, sizeof(int));//会把空间都初始化成0if (NULL == p){perror("calloc");return 1;}int i = 0;for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}
4.realloc
对动态开辟的内存进行调整。
1.memblock是要调整内存的地址,size是调整后的新大小,返回值为调整后内存的起始位置;
2.若原空间足够,则在原空间之后直接追加,原来的数据不发生变化;
若原空间大小不够,这时会在堆空间上另找一个合适大小的空间来使用,并返回新的内存空间地址,原地址处的空间会被释放。
int main()
{int* ptr = (int*)malloc(40);//在堆区开辟一块40字节的空间,并以整形的格式来管理if (NULL == ptr){perror("malloc");return 1;}int i = 0;for (i = 0; i < 10; i++){*(ptr + i) = i;}int* p = (int*)realloc(ptr, 80);//调整空间开辟if (NULL != p){ptr = p;}free(ptr);return 0;
}
二、文件操作
1.文件指针
每个被使用的文件都在内存中开辟了一块文件信息区,用来存放文件的相关信息,保存在一个结构体变量中,名为FILE;
我们可以创建一个FILE*的指针变量;
FILE* pf;//文件指针变量
定义pf是指向FILE类型数据的指针变量,可以使pf指向某个文件的信息区,通过指针访问该文件。
2.文件的打开和关闭
使用fopen函数来打开文件,fclose函数来关闭文件;
打开文件后,会自动创建文件信息区,并返回起始地址;
int main()
{//打开文件FILE* pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}//文件操作//关闭文件fclose(pf);pf = NULL;return 0;
}
打开文件的方式如下:
3.文件的顺序读写
文件的顺序读写函数如下:
1.字符输入输出函数
将字符输出到文件中;
int main()
{//打开文件FILE* pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}//写文件 - 字符输出操作char ch = 'a';for (ch = 'a'; ch < 'z'; ch++){fputc(ch, pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}
读取文件中的字符;
int main()
{//打开文件FILE* pf = fopen("test.txt", "r");//注意文件打开方式if (NULL == pf){perror("fopen");return 1;}//读文件 - 输入操作int ch = 0;while ((ch = fgetc(pf)) != EOF)//直到读到EOF才停下来{printf("%c ", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}
2.文本行输入输出函数
将一行数据写入到文件中;
int main()
{//打开文件FILE* pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}//文本行输出char arr[] = "hello world";fputs(arr, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
int main()
{//打开文件FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}//文本行输入char arr[256] = { 0 };fgets(arr, 255, pf);printf("%s\n", arr);//只读一行//关闭文件fclose(pf);pf = NULL;return 0;
}
3.格式化输入输出函数
按照指定格式将数据写入到文件内(与printf函数类似);
struct S
{char name[10];int age;char sex[5];
};int main()
{struct S stu = { "LMX", 20, "man"};//打开文件FILE* pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}//格式化输出函数fprintf(pf, "%s %d %s", stu.name, stu.age, stu.sex);//关闭文件fclose(pf);pf = NULL;return 0;
}
按照指定格式从文件中读取数据到指定位置(与scanf函数类似);
struct S
{char name[10];int age;char sex[5];
};int main()
{struct S stu = { "LMX", 20, "man"};//打开文件FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}//格式化输入函数fscanf(pf, "%s %d %s", stu.name, &stu.age, stu.sex);printf("%s %d %s", stu.name, stu.age, stu.sex);//关闭文件fclose(pf);pf = NULL;return 0;
}
4.二进制数输入输出函数
将数据以二进制代码的形式写入到文件中;
struct S
{char name[10];int age;char sex[5];
};int main()
{struct S stu = { "LMX", 20, "man"};//打开文件FILE* pf = fopen("test.txt", "wb");if (NULL == pf){perror("fopen");return 1;}//二进制输出fwrite(&stu, sizeof(struct S), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
读取文件中的二进制数据,并保存到指定位置;
struct S
{char name[10];int age;char sex[5];
};int main()
{struct S s1 = { 0 };//打开文件FILE* pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen");return 1;}//二进制输入fread(&s1, sizeof(struct S), 1, pf);printf("%s %d %s", s1.name, s1.age, s1.sex);//关闭文件fclose(pf);pf = NULL;return 0;
}
4.文件的随机读写
让文件指针从指定位置按照偏移量进行偏移,偏移量为正数是向后偏移,偏移量为负数是向前偏移;
返回当前文件指针相对于起始位置的偏移量;
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);//aprintf("%c\n", ch);ch = fgetc(pf);//bprintf("%c\n", ch);//定位文件指针fseek(pf, 2, SEEK_CUR);//返回当前文件指针的偏移量long pos = ftell(pf);printf("%ld\n", pos);ch = fgetc(pf);//eprintf("%c\n", ch);//让文件指针返回起始位置rewind(pf);ch = fgetc(pf);printf("%c\n", ch);pf = NULL;return 0;
}
5.文件读取结束的判定
feof()函数是用来判断当文件读取结束时,是读取结束失败,还是遇到文件尾结束,返回值为1就是遇到文件尾;
文件读取结束的判定方法为:
1.文本文件结束时,fgetc函数判断返回值是否为EOF,fgets函数判断返回值是否为NULL;
2.二进制文件结束时,判断返回值是否小于需要读取的数据个数;
6.文件缓冲区
系统自动为每一个正在使用的文件开辟一块文件缓冲区,从内存向磁盘输出数据时,会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上;从磁盘读取数据与写数据类似,也是先存到缓冲区。
C语言知识点 -- 动态内存管理、文件操作相关推荐
- C语言进阶——动态内存管理
目录 一.为什么存在内存分配 二.动态内存函数 1.malloc 2.free 3.calloc 4.realloc 三.常见的动态内存错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访 ...
- 【C语言】动态内存管理
文章目录 前言 一.动态内存函数介绍 1. malloc和free 2. calloc 3. realloc 二.常见的动态内存错误 1.对NULL指针进行解引用操作 2.对动态开辟空间的越界访问 3 ...
- C语言之动态内存管理与动态内存函数
文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...
- C语言程序设计 | 动态内存管理:动态内存函数介绍,常见的动态内存错误,柔性数组
动态内存管理目录: 动态内存函数的介绍 常见的动态内存函数的错误 柔性数组 为什么会有动态内存管理呢 我们在日常使用中,创建一个数组,一个变量时都会开辟空间 如: int a; //在栈上开辟一个四字 ...
- (C语言)动态内存管理
本篇文章计划用最简单的方式向大家介绍C语言动态内存管理这一问题 如果各位看官姥爷们觉得有用的话,不妨动动你们手指,点赞.评论.收藏哦! 目录 1.为什么需要动态内存分配 2.动态内存的介绍 2.1ma ...
- C语言:动态内存管理
目录 一.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc 4.realloc 常见的动态内存错误 1. 对NULL指针的解引用操作 2.对动态开辟空间 ...
- C语言之动态内存管理
目录 为什么存在动态内存管理 动态内存函数 malloc和free函数 calloc realloc 动态内存的常见错误 1对空指针的解引用操作 2对动态开辟空间的越界访问 3使用free来释放非动态 ...
- 【Contact】结构体+动态内存管理+文件存储实现简易通讯录代码
目录 静态版本 test.c contact.h contact.c 动态版本 test.c contact.h contact.c 文件的版本 test.c contact.h contact.c ...
- 【C语言】动态内存管理 [进阶篇_ 复习专用]
最新文章
- 提高C#编程水平的50个要点
- 聊聊php定时计划任务
- sts无法创建java_java – STS无法在我的机器上启动
- 网络营销立足于网站自身的优化与运营
- oracle 取第三大的值,Oracle数据基础(三)
- Java获取当前日期的前一个月,前一天的时间
- ZAP-Queries(洛谷-P3455)
- windows 设置 rocketmq环境变量_RocketMQ 开篇
- fckeditor 图片上传 java_ckeditor用fckeditor的文件管理器实现图片上传
- php网站iis7.5 session,IIS 7.5 asp Session超时时间设置方法
- 魅族手机Root之后如何恢复
- 工作两年简历写成这样,谁要你呀!
- NLP工具——NLTK 安装及使用
- 达人评测 华为matebook16对比联想小新pro16锐龙版 2021哪个好
- 基于Java的Minecraft游戏后端自定义插件 的Java实践项目整理
- IOS实现Voip应用后台运行需要的几个配置项
- git rebase 的几种用法
- 网页铺满全屏,不需滚动条的设置方法
- 2018年信息系统项目管理师(高级)考试报名
- ubuntu安装vasp_vasp编译简略指南(自用)
热门文章
- 微信社群私域流量怎么搭建?如何正确运营?
- 土的液塑限计算机自动图形生成,液塑限自动生成器 (1).xls
- 「腾讯电脑管家论坛活动」情人眼里出西施,百姓家家过春节
- 西电捷通: Windows LWF驱动如何兼容TISec客户端
- python获取前n周第一天和最后一天
- 【浙大脑机接口实验室探秘】人类与AI控制大鼠走出迷宫,C10背负的混合智能未来(视频)...
- 手把手教你轻松日薅数万精准客户邮箱
- oracle随机生成记录_区块链上的随机性:概述与构造
- 怎么办才能忘记深爱的人?
- Python九阴真经秘诀