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语言知识点 -- 动态内存管理、文件操作相关推荐

  1. C语言进阶——动态内存管理

    目录 一.为什么存在内存分配 二.动态内存函数 1.malloc 2.free 3.calloc 4.realloc 三.常见的动态内存错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访 ...

  2. 【C语言】动态内存管理

    文章目录 前言 一.动态内存函数介绍 1. malloc和free 2. calloc 3. realloc 二.常见的动态内存错误 1.对NULL指针进行解引用操作 2.对动态开辟空间的越界访问 3 ...

  3. C语言之动态内存管理与动态内存函数

    文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...

  4. C语言程序设计 | 动态内存管理:动态内存函数介绍,常见的动态内存错误,柔性数组

    动态内存管理目录: 动态内存函数的介绍 常见的动态内存函数的错误 柔性数组 为什么会有动态内存管理呢 我们在日常使用中,创建一个数组,一个变量时都会开辟空间 如: int a; //在栈上开辟一个四字 ...

  5. (C语言)动态内存管理

    本篇文章计划用最简单的方式向大家介绍C语言动态内存管理这一问题 如果各位看官姥爷们觉得有用的话,不妨动动你们手指,点赞.评论.收藏哦! 目录 1.为什么需要动态内存分配 2.动态内存的介绍 2.1ma ...

  6. C语言:动态内存管理

    目录 一.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc 4.realloc 常见的动态内存错误 1. 对NULL指针的解引用操作 2.对动态开辟空间 ...

  7. C语言之动态内存管理

    目录 为什么存在动态内存管理 动态内存函数 malloc和free函数 calloc realloc 动态内存的常见错误 1对空指针的解引用操作 2对动态开辟空间的越界访问 3使用free来释放非动态 ...

  8. 【Contact】结构体+动态内存管理+文件存储实现简易通讯录代码

    目录 静态版本 test.c contact.h contact.c 动态版本 test.c contact.h contact.c 文件的版本 test.c contact.h contact.c ...

  9. 【C语言】动态内存管理 [进阶篇_ 复习专用]

最新文章

  1. 提高C#编程水平的50个要点
  2. 聊聊php定时计划任务
  3. sts无法创建java_java – STS无法在我的机器上启动
  4. 网络营销立足于网站自身的优化与运营
  5. oracle 取第三大的值,Oracle数据基础(三)
  6. Java获取当前日期的前一个月,前一天的时间
  7. ZAP-Queries(洛谷-P3455)
  8. windows 设置 rocketmq环境变量_RocketMQ 开篇
  9. fckeditor 图片上传 java_ckeditor用fckeditor的文件管理器实现图片上传
  10. php网站iis7.5 session,IIS 7.5 asp Session超时时间设置方法
  11. 魅族手机Root之后如何恢复
  12. 工作两年简历写成这样,谁要你呀!
  13. NLP工具——NLTK 安装及使用
  14. 达人评测 华为matebook16对比联想小新pro16锐龙版 2021哪个好
  15. 基于Java的Minecraft游戏后端自定义插件 的Java实践项目整理
  16. IOS实现Voip应用后台运行需要的几个配置项
  17. git rebase 的几种用法
  18. 网页铺满全屏,不需滚动条的设置方法
  19. 2018年信息系统项目管理师(高级)考试报名
  20. ubuntu安装vasp_vasp编译简略指南(自用)

热门文章

  1. 微信社群私域流量怎么搭建?如何正确运营?
  2. 土的液塑限计算机自动图形生成,液塑限自动生成器 (1).xls
  3. 「腾讯电脑管家论坛活动」情人眼里出西施,百姓家家过春节
  4. 西电捷通: Windows LWF驱动如何兼容TISec客户端
  5. python获取前n周第一天和最后一天
  6. 【浙大脑机接口实验室探秘】人类与AI控制大鼠走出迷宫,C10背负的混合智能未来(视频)...
  7. 手把手教你轻松日薅数万精准客户邮箱
  8. oracle随机生成记录_区块链上的随机性:概述与构造
  9. 怎么办才能忘记深爱的人?
  10. Python九阴真经秘诀