c语言内存和文件处理有关知识

news2024/11/27 14:46:00

内存

在这里插入图片描述

分配内存的函数calloc,malloc

定义于头文件 <stdlib.h>功能
malloc分配内存(函数)
calloc分配并清零内存(函数)
realloc扩充之前分配的内存块(函数)
free归还还之前分配的内存(函数)
aligned_alloc(C11)分配对齐的内存(函数)

函数原型

void *malloc(unsigned int size)  //注意使用时,若要4个int类型数据空间需要使用:4*sizeof(int)也就是16
void* calloc( size_t num, size_t size );   //这里参数则是(4,sizeof(int)),参数规定把数量和数据类型分开

其中数据类型size_t可以简单理解为一个无符号整型
在这里插入图片描述
主要是 malloc 和 calloc 的区别。 calloc 会申请内存,并全初始化为 0;而 malloc 只申请内存,并不作初始化。

#include <stdio.h>   
#include <stdlib.h> 
 
int main(void) 
{
    int *p1 = malloc(4*sizeof(int));  // 足以分配 4 个 int 的数组
    int *p2 = malloc(sizeof(int[4])); // 等价,直接命名数组类型
    int *p3 = malloc(4*sizeof *p3);   // 等价,免去重复类型名
 
    if(p1) {
        for(int n=0; n<4; ++n) // 置入数组
            p1[n] = n*n;
        for(int n=0; n<4; ++n) // 打印出来
            printf("p1[%d] == %d\n", n, p1[n]);
    }
 
    free(p1);
    free(p2);
    free(p3);
}

可以利用这种动态分配内存和scanf函数得到一个动态长度的数组

代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n=0,i;
	int *pa;
	printf("请输入数组长度:");
  	scanf("%d",&n);
	pa = (int *)calloc(n,sizeof(int));   //指针指向分配空间的首地址
	for(i=0;i<n;i++){
		scanf("%d",&pa[i]);
	}
	
	for(i=0;i<n;i++){
		printf("输入的数据是:%d\n",pa[i]);
	}
	free(pa);  //释放pa指针
	for(i=0;i<n;i++){
		printf("输入的数据是:%d\n",pa[i]);   //这里的指针将指向不定的地址
	}
	system("pause");
   
   return 0;
}

文件操作fopen,fclose,FIL

遇到的问题总结

 1. 字符串使用双引号"",字符赋值使用单引号'',(长时间不用c忘了)
 2. 判断语句(fp=fopen("fiel.txt","r+"))==NULL;的括号不能少,否则会出现先逻辑判断后赋值,这样编译不通过
 3. 判断读取文件是否正确一定使用"r""r+"模式,因为另外模式都会新建,
 4. 在打开文件读取后想要写入,"一定"使用fseek定位文件指针才行
 5. 一个奇怪的现象,a+模式:写入只是指针移动,不能修改本来的文本;但读取可以从全部文本最开始
 6. 字符串的写入都是自动在结尾包含了\0结束字符,所以指针会比字符串多移动一位
 7. 在r+模式下既可以对原始文本插入,也可以读取,但写入也要满足第4

文件打开函数的模式

FILE *fp;
fp = fopen("路径","打开方式")

在这里插入图片描述

对文本字符操作的函数

具体功能可查看:https://zh.cppreference.com/w/c/io
在这里插入图片描述

函数使用实例

如果文件不存在可能会导致编译出现,run: line 1: 3 Segmentation fault (core dumped) ./a.out
Exited with error status 139

读取命令实例

file.txt

123456789

#include <stdio.h>
#include <stdlib.h>

int main(void){
	FILE *fp;
	char f_getc,f_gets[4],f_read[4],f_scanf[4];  
	char f_getc,f_gets[5],f_read[8],f_scanf[4];  //换成这句就和预期结果一样了 
	fp = fopen("file.txt","r");
	
	f_getc = fgetc(fp);
	printf("fgetc: %c\n",f_getc);
	
	rewind(fp);
	fgets(f_gets,5,fp);  //这里的“一定”要是一个字符串数组
	printf("fgets:%s\n",f_gets);  //得到n-1个字符,最后一个自动填充\0
	
	fflush(fp);
	fseek(fp,0,0);
	fread(f_read,sizeof(char),3,fp);     //这里读取有问题,但单独使用没问题
	printf("fread: %s\n",f_read);
	//fflush(fp);
	rewind(fp);
	fscanf(fp,"%s",f_scanf);  
	printf("f_scanf: %s\n",f_scanf);

	fclose(fp);
	printf("*************************************");
	printf("文件中全部字符!!!\n");
	system("type file.txt ");   //这里会全部显示一次
	printf("\n");
	system("pause");	
	return 0;
}

参考:https://editor.csdn.net/md/?articleId=128229605
在这里插入图片描述
参考:https://zh.cppreference.com/w/c/io,https://blog.csdn.net/qq_26768741/article/details/50933598,https://blog.csdn.net/qq_45858169/article/details/103704389
经过尝试和查找资料发现,确实是有缓存中字符的问题,也有一个错误的地方,fread是针对读取的二进制流文件读取,但不是造成这种显示的主要原因;而最主要的原因是读取字符的数组不够,导致读取数据时,没有将终止符或回车符放入字符串,导致输出时在变成输出缓存中读取了数据,为了深入解释这个输出异常的原因,单独分开一个文件中,测试和分析

“+”模式添加的不同

#include <stdio.h>
#include <stdlib.h>

int main(void){
	FILE *fp;
	char b;
	//每次测试保证txt文件中只"有123456"这6个字符;
	fp=fopen("file.txt","a+");   //只仅仅修改这里的模式为a+和a,和保证txt开始文本只有123456
	rewind(fp);  //指针在文件开始
	b = fgetc(fp);
	printf("第一次读:%c\n",b);
	fseek(fp,2,0);
	printf("第二次读:%c\n",fgetc(fp));
	fseek(fp,2,0);
	fputs("sag",fp);
	printf("第三次读:%c\n",fgetc(fp));

	fclose(fp);
	system("type file.txt ");  //只是在cmd窗口显示文本内容,懒得每次打开txt查看
	printf("\n");
	system("pause");	
	return 0;
}

显示结果a+和a对比分析:

a模式没有读取数据的功能,但能写入,a+模式有读写的功能,但写指针和读指针不是同一位置,而且写文本时会同时移动两个指针,但会一直在文档结尾追加
在这里插入图片描述

a+可读写的文件出现的问题

一次写入命令后,若不定位指针,那么紧接着的读取命令也会写入;a+模式下,文档最后写入了6。因此,需要注意每次读取和写入文本命令转换时重新使用feek(fp,n,0)定位
在这里插入图片描述

r+模式下

读和写命令转换时也会出现问题,

#include <stdio.h>
#include <stdlib.h>

int main(void){
	FILE *fp;
	char a[4],b;

	fp=fopen("file.txt","r+");
	rewind(fp);
	b = fgetc(fp);
	printf("第一次读:%c\n",b);
	fseek(fp,2,0);
	printf("第二次读:%c\n",fgetc(fp));
	fseek(fp,1,0);
	fputs("sa",fp);
	//fseek(fp,2,0);
	printf("第三次读:%c\n",fgetc(fp));

	fclose(fp);
	system("type file.txt ");
	printf("\n");
	system("pause");	
	return 0;
}

下图中的,虽然是fgetc导致的5被写入,但通过fgetc写入的描述并不准确,只是将5读入缓存,而fputs函数在写入的字符串最后也自动添加换行“\n”和终止符“\0”,因此输入的字符变成了"sa5"

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础之Collection的ArrayList

Java基础之Collection的ArrayList一、add()与addAll()二、remove()三、trimToSize()1、案例一、add()与addAll() 跟C 的vector不同&#xff0c;ArrayList没有push_back()方法&#xff0c;对应的方法是add(E e)&#xff0c;ArrayList也没有insert()方法&#xff0c;对应的方法是…

Oracle---初学篇

Oracle初学篇 Oracle的启动&#xff0c;监听&#xff0c;用户 文章目录Oracle初学篇Oracle的启动Oracle的监听监听服务的主要文件1.listener.ora2.tnsnames.ora3.sqlnet.oraOracle用户Oracle安装成功后默认的三个用户创建用户Oracle的启动 之前写了关于如何在CentOS7上搭建Ora…

2021年全国研究生数学建模竞赛华为杯D题抗乳腺癌候选药物的优化建模求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 D题 抗乳腺癌候选药物的优化建模 原题再现&#xff1a; 一、背景介绍   乳腺癌是目前世界上最常见&#xff0c;致死率较高的癌症之一。乳腺癌的发展与雌激素受体密切相关&#xff0c;有研究发现&#xff0c;雌激素受体α亚型&#xff0…

LeetCode 0547. 省份数量:图的连通分量

【LetMeFly】547.省份数量 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-provinces/ 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a …

Windows文件夹开启大小写敏感

Windows 的文件系统的文件名&#xff0c;是大小写不敏感的&#xff0c;也就是你的文件名是 a.txt 或者 A.txt&#xff0c;在 Windows 中都是一视同仁&#xff0c;认为是同一个文件。 自从 Windows 10 引入 Linux 子系统&#xff08;WSL&#xff09;后&#xff0c;有越来越多开…

JAVA毕业设计——基于ssm的汽车租赁管理系统 (源代码+数据库)

代码地址 https://github.com/ynwynw/carRental-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springboot的汽车租赁管理系统 (源代码数据库)601 一、系统介绍 汽车租赁系统总共分为两个大的模块&#xff0c;分别是系统模块和业务模块。其中系统模…

基于混沌原子搜索优化的电力系统(HPS)负载频率自动控制(ALFC)(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Spring Security 中的四种权限控制方式

Spring Security 中对于权限控制默认已经提供了很多了&#xff0c;但是&#xff0c;一个优秀的框架必须具备良好的扩展性&#xff0c;恰好&#xff0c;Spring Security 的扩展性就非常棒&#xff0c;我们既可以使用 Spring Security 提供的方式做授权&#xff0c;也可以自定义授…

如何实现外网访问API接口

Application Programming Interface 缩写为API&#xff0c;中文翻译为“应用程序接口”&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&…

TVS管开关电源防护应用及电源防护元件的品类

瞬态抑制二极管简称TVS管。其作用原理是能够在极短的时间内承受反向电压的冲击&#xff0c;使得两极之间的电压钳位在特定电压水平上&#xff0c;有效避免了对后面电路的冲击&#xff0c;从而保护了被保护电子线路中的精密元件不受其损害。 瞬态抑制二极管TVS的钳位响应速度为为…

pytest + yaml 框架 -7.用例分层机制

前言 当我们测试流程类的接口&#xff0c;需反复去调用同一个接口&#xff0c;就会想到复用API&#xff0c;在代码里面可以写成函数去调用。 那么在yaml 文件中&#xff0c;我们可以把单个API写到一个yaml 文件&#xff0c;测试用例去调用导入API。 pip 安装插件 pip instal…

电子产品设计的流程有哪些

电子产品设计过程是指导工业外观设计的具体环节&#xff0c;主要包括产品市场需求分析、产品设计、产品原型设计、生产测试设计、大规模生产等方法和步骤。 一、电子产品设计流程是什么? 1.产品市场需求分析是电子产品设计成功的第一步&#xff0c;也是非常重要的一步。开发者…

JavaSE(数组)

1. 数组 数组创建及初始化 总结&#xff1a; 三种写法包括了动态初始化和静态初始化&#xff0c;其中省略格式不能再省略&#xff08;拆分&#xff09;&#xff1b;没有初始化时&#xff08;默认值为基类类型对应的默认值&#xff09;其中引用类型的默认值为null 三种写法 1…

RK3288-8.1-添加一个人体感应的开关-pir_pin_status

收到一个人体感应的需求,在设置添加一个开关 第一步,确定人体感应接口的GPIO 可知GPIO7_B5为对应GPIO 第二步,注册对应DTS 然后去驱动内注册对应的节点 很基础的东西,就不多说了,省略一万字......................(得到节点) cat sys/devices/platform/attr/pir_pin_status …

CAD尺寸标注不显示数值

在创建一个新的CAD图纸后&#xff0c;使用CAD尺寸标注会看见只有一条直线而没有数字显示&#xff0c;这是为什么呢&#xff1f;实际上是存在数值的&#xff0c;只是默认的数值很小&#xff0c;如果图形尺寸过大就看不清楚需要放大才能看见&#xff0c;就需要调整CAD尺寸标注的格…

RSS Can:借助 V8 让 Golang 应用具备动态化能力(二)

继续聊聊之前做过的一个小东西的踩坑历程&#xff0c;如果你也想高效获取信息&#xff0c;或许这个系列的内容会对你有用。 写在前面 在上一篇文章《RSS Can&#xff1a;使用 Golang 实现更好的 RSS Hub 服务&#xff08;一&#xff09;》里&#xff0c;我们简单介绍了使用 G…

数字孪生技术在智慧园区领域的实践

随着云计算、物联网、大数据、人工智能、5G 等为代表的技术迅速发展和 深入应用&#xff0c;“智慧园区”建设已成为全球园区发展的新趋势。近年来&#xff0c;党中央 和国务院更加注重智慧园区的建设与发展&#xff0c;相继出台了多项政策推动智慧园区的建设&#xff0c;智慧园…

数据镜像软件

什么是数据镜像 数据镜像是复制已传输到 USB 设备或在 USB 设备中修改的文件内容的过程。创建镜像副本后&#xff0c;可以在受密码保护的网络共享中维护这些副本。此共享文件夹最好保存在远程位置&#xff0c;以节省本地计算机上的空间。这样&#xff0c;只有管理员或受信任的…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于疫情防控下社区管理平台my3tu

对于即将毕业或者即将做课设的同学而言&#xff0c;由于经验的欠缺&#xff0c;面临的第一个难题就是选题&#xff0c;确定好题目之后便是开题报告&#xff0c;如果选题首先看自己学习那些技术&#xff0c;不同技术适合做不同的产品&#xff0c;比如自己会些简单的Java语言&…

Flutter自定义MultiChildRenderObjectWidget实现圆环布局效果

一、本文主要是学习巩固一下自定义RenderObject这一块内容&#xff0c;用所了解到的知识实现一个圆环布局效果 本篇文章主要参考了恋猫de小郭Flutter 完整开发实战详解&#xff08;十六、详解自定义布局实战&#xff09;文章&#xff0c;大家可以先看完这篇文章再来阅读本篇这…