资讯专栏INFORMATION COLUMN

C语言炫酷的文件操作

MudOnTire / 1825人阅读

摘要:也就是说,通过文件指针变量能够找到与它关联的文件。但上面的文件指针并未指向明确的位置,他暂时是一个野指针。在编写程序的时候,在打开文件的同时,都会返回一个的指针变量指向该文件,也相当于建立了指针和文件的关系。

什么是文件

磁盘上的文件是文件
但是在程序设计中,我们一般谈的文件有两种:程序文件和数据文件(从文件功能的角度来分类)。

程序文件

包括源程序文件(例如.c文件)目标文件(windows环境后缀为.obj)可执行程序(windos环境后缀为exe)。

数据文件 (本文重点)

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

文件名

文件就像人一样,他也要有姓氏和名字来让其他文件或者人知道这个文件是谁。
对于每一个文件要,,都有一个唯一的文件标识,以便用户识别和引用。
文件名格式:文件路径+文件名主干+文件后缀

例如:D:/CSDN/Test.txt

为了方便起见,我们叫文件标识为文件名

文件的打开和关闭

文件指针

我们知道,指针是指向一个地址的,整形指针指向一个整形的空间,数组指针指向一个数组的空间,那么文件指针自然就是指向文件的指针了。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE。
这是再vs的stdio头文件下的文件信息区结构体

struct _iobuf {        char *_ptr;        int   _cnt;        char *_base;        int   _flag;        int   _file;        int   _charbuf;        int   _bufsiz;        char *_tmpfname;        };typedef struct _iobuf FILE;//不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

就像学生要有学号姓名年龄这些信息一样,文件也有他的信息,比如这个文件的地址。这些信息存放于这个结构体中,通过typedef重命名为FILE,并且我们不需要关心一些细节(你会关心我昨天晚上吃了什么吗)。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
下面我们可以创建一个FILE*的指针变量:

FILE* pf;

pf通过该文件信息区中的信息就能够访问该文件。
也就是说,通过文件指针变量能够找到与它关联的文件。
但上面的文件指针并未指向明确的位置,他暂时是一个野指针

所以接下来,我们来学习如何打开(创建)一个文件。

文件函数

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定使用fopen函数来打开文件,fclose来关闭文件。

//打开文件FILE* fopen(const char *filename,const char *mode);//第一个参数是文件名,第二个参数是打开方式//关闭文件int Fclose(FILE *stream);

部分打开方式如下图

现在我们来练习一下打开文件

//打开文件	FILE* pf = fopen("data.txt","r");	//以只读的方式打开这个文件	//如果文件打开失败会返回空,否则会返回指向该文件的指针	if (pf == NULL){		perror("fopen");		return -1;	}	//读文件	//关闭文件	fclose(pf);	pf = NULL;	return 0;


但是却打开失败了!!
原因是,从上面的打开方式一图我们可以看出,以"r"方式打开,需要该文件真实存在,但是我并没有创建这个文件,所以打开失败了

叮~文件创建成功

我们再来看执行结果

这回没有报错

但是,这里是将data.txt文件放在了该.c文件目录下,在我将该文件放在别的地方,仍然打开失败报错。
原因是,我们这段代码只输入了文件名,所以他只在当前文件目录下寻找该文件,在其他地方的文件我们就找不到了。
这里我们来看看两个东西,一个叫相对路径,一个叫绝对路径

相对路径与绝对路径

相对路径

只认为是当前目录下的文件,如上面的代码中。

绝对路径

带上文件的从磁盘到目标文件的路径
例如
D:/Program Files/data.txt
但是请注意,在编程中,/是转义字符,所以我们需要让/不再是转义字符,使其代表它本身
D:/Program Files/data.txt

输入输出流

什么是输入输出流
学习过编程,一定知道printf或者cont或者System.out.println吧,
这些函数用于打印数据,这就是标准的输出流。使数据输出或者写入文件中,我们叫输出流。
我们打印HELLO WORLD在屏幕上,就是一个标准输出流
像scanf之类的,从文件输入或者读数据到内存中,就是输入流。
一些基本的输入输出函数如下。

比如,fputc就是写一个字符进去,fgetc就是读一个字符。

//打开文件	FILE* pf = fopen("data.txt","w");	if (pf == NULL){		perror("fopen");		return -1;	}	//读文件	fputc("a", pf);	fputc("b", pf);	fputc("c", pf);	//fputc第一个参数为输入的字符,第二个使对应文件的指针	//关闭文件	fclose(pf);	pf = NULL;	return 0;


写入了abc三个字符。
fputc和fgetc每次读/写一个字符后,文件指针pf会向后移动,类似strtok函数。会记录上一次输入/输出的地址。
如果不这样,那岂不是一直在一个位置重复写入或者读文件了。

接下来看看fgetc读取字符

//打开文件	FILE* pf = fopen("data.txt","r");	if (pf == NULL){		perror("fopen");		return -1;	}	//读文件	int a = fgetc(pf);	printf("%c", a);	a = fgetc(pf);	printf("%c", a);	a = fgetc(pf);	printf("%c",a);	//关闭文件	fclose(pf);	pf = NULL;	return 0;

执行结果

这就是顺序读写,按着顺序读入写入。
当然,有顺序读写,就会有随机读写
从字面意思就能看到,随机读写emmm。

当然,除了fgetc这类,fgets自然就是读取一行了(只会读/写一行哦)
如果你用这类函数输出在标准输入或者标准输入(stdout或者stdin)上,他和printf,scanf没什么区别。

接下来,我们来看二进制的读和写

二进制读写

fwirte


以二进制的形式将内容写入文件中
第一个参数是你要写入数据的数据地址,第二个参数是一个类型的大小(字节)。第三个参数是你要写入几个数据,第四个则是你选定写入的流。

struct S{	int n;	double d;	char name[10];};int main(){	struct S s = { 10, 3.14, "zhangsan" };	//打开文件	FILE* pf = fopen("data.txt","wb");	if (pf == NULL){		perror("fopen");		return -1;	}	//读文件	fwrite(&s,sizeof(s),1,pf);	//关闭文件	fclose(pf);	pf = NULL;	return 0;}

如上代码会将数据以二进制的形式写入data.txt
虽然我们看不懂,但是能看到zhangsan是我们输入的内容

fread

以二进制的形式读

和fwirte一样,只不过buffer不是const形式了,因为我们要将数据读入该指针指向的目标。

struct S{	int n;	double d;	char name[10];};int main(){	struct S s = {0};	//打开文件	FILE* pf = fopen("data.txt","rb");	if (pf == NULL){		perror("fopen");		return -1;	}	//读文件	fread(&s,sizeof(struct S),1,pf);	printf("%d  %lf  %s/n",s.n,s.d,s.name);	//关闭文件	fclose(pf);	pf = NULL;	return 0;}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121968.html

相关文章

  • mix-blend-mode及background-blend-mode实现酷的图片样式

    摘要:在网上看到了有如相机功能的实现比较好看的图片样式,自己也想弄下,在这里记录下效果图相关属性正常正片叠底滤色叠加变暗变亮颜色减淡颜色加深强光柔光差值排除色相饱和度颜色 在网上看到了有如相机功能的mix-blend-mode实现比较好看的图片样式,自己也想弄下,在这里记录下 1.效果图 showImg(https://segmentfault.com/img/bVblsM0?w=726&...

    gougoujiang 评论0 收藏0
  • mix-blend-mode及background-blend-mode实现酷的图片样式

    摘要:在网上看到了有如相机功能的实现比较好看的图片样式,自己也想弄下,在这里记录下效果图相关属性正常正片叠底滤色叠加变暗变亮颜色减淡颜色加深强光柔光差值排除色相饱和度颜色 在网上看到了有如相机功能的mix-blend-mode实现比较好看的图片样式,自己也想弄下,在这里记录下 1.效果图 showImg(https://segmentfault.com/img/bVblsM0?w=726&...

    jackwang 评论0 收藏0
  • H5 是 HTML5 吗?

    摘要:我相信现在大多数人认为的页面,就是在手机微信分享的那种炫酷的网页。 背景 作为程序员经常会被业务人员问一些技术相关的热门词,比如:H5页面是什么? , 我的回答是:符合 HTML5 标准实现的页面,大家为了方便,简称 H5。 真的是这样的吗? 当连续有人问相关的问题,并详细了解一些业务以后,慢慢的发现 H5 已经不单单是一个技术相关的词。 之前被我们产品人员也问到一个类似的问题:怎么通...

    gaomysion 评论0 收藏0
  • three.js实现酷的3d影院

    摘要:光晕效果必须设置主要的光线还是靠模拟设置光晕的范围后记入门教程源码地址原创不易,辛苦各位大大点个 阅读本文章可以获取到的知识 创建一个3d的空间 粒子效果 three.js点击事件的处理 着色器的初步使用 实现一个光晕效果 1.创建一个3d的空间 可以想象一下我们在房间内,房间是一个立方体,如果你有生活品味,可能会在房间内贴上壁纸,three.js可以很方便的创建一个立方体,并且给...

    luckyw 评论0 收藏0
  • electron-ui 快速方便的打造酷的桌面应用

    摘要:是什么是基于和扩展出来的一套基础的应用框架,目的是为了快速的搭建炫酷的桌面应用,其实也算不上框架只是一种解决方案而已,让后来的开发者在少采坑的情况下搭建出相对漂亮而快速的应用为什么要做这个公司的有个项目使用搭建的,最开始只是套了个网页 electron-ui是什么 electron-ui是基于electron和electron-vue扩展出来的一套基础的应用框架,目的是为了快速的搭建炫...

    Magicer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<