文件管理【详解归纳】

一、为什么要存在文件?

我们写程序的数据,是存储在内存中的,当程序退出,内存回收,数据就丢失了,当再次使用时,则需重新输入。而文件的存在则很好的解决了这一问题,我们写的数据可以存储在文件中,进行持久化的保存,

二、文件的相关概念

存储在硬盘或磁盘的数据叫做文件,而文件按功能划分,可以分为程序文件,数据文件

程序文件:源程序文件.c,目标文件.bj(window中),可执行程序.exe

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

文件名:文件名要有一个唯一文件标识,文件名包含三个部分,文件路径+文件名主干+文件后缀,为了方便起见,文件标识常被称为文件名。

二进制文件与文本文件:根据数据的存储形式,可以分为二进制文件,与文本文件,不经过转化,直接输入到外存的文件,称为二进制文件,计算机语言,一般是看不懂的,而文本文件,数据经过ASCII转化,存储到文件中,是人们所能读得懂的。

三、流

我们把内存作为参照物,将键盘,屏幕,鼠标,u盘,当作外源设备。内存与这些外源设备往来的时候,需要读取数据,与输入数据,为了方便用户对这些外源设备进行操作,我们引入了流的概念。

流是一抽象的概念,如同溪流,将内存作为第一人称对待,则流可以分为两类:我们将流入内存的流,称为输入流,流出内存的流,称为输出流。

而我们对于各种流的使用,都得进行打开,或者关闭。试问一下,我们手里的键盘,眼前的屏幕,是不是对应着相应流?毕竟我们需要用键盘向内存去输入数据,需要用屏幕从内存向外去打印数据。那既然这样说了,那肯定属于流的概念。那我们为啥没有进行打开与关闭的操作呢?其实任意一个程序在打开的时候,都会默认打开三个标准的流。

标准输入流 - stdin - 键盘

标准输出流 - stdout - 屏幕

标准错误流 -  stderr - 错误

四、文件的打开与关闭

文件在使用的时候,得经历打开与关闭的操作,此时我们将用到,下面的两个函数,

FILE *fopen( const char *filename, const char *mode );第一个参数是文件名,第二是参数打开文件的模式。若打开成功,则返回一个该文件起始位置的FILE* 的指针,这里给我们提供了一个与文件联系的方式。若打开失败,则返回一个NULL,空指针。所以我们在使用的时候,得先排除返回是空指针的情况。

打开模式有(r w a r+ w+ a+ rb wb ab rb+ wb+ ab+)12种,但是有b代表的是二进制模式读写,其余的和下面六种相同。

”r“:只读,若文件不存在,则打开错误。指针位于起始位置。 

“w”:只写,若文件不存在,则新创建一文件。指针位于起始位置。(会删除该文件先前的所以内容。)

“a”:追加,若文件不存在,则新创建一文件。指针位于文件末尾。(只能向末尾追加内容)

"r+"读写,若文件不存在,则打开错误。指针位于起始位置

"w+"读写,若文件不存在,则新创建一文件。指针位于起始位置(会删除该文件先前的所有内容。)

"a+"读写,若文件不存在,则新创建一文件,指针位于文件末尾。(只能向末尾追加内容)

int fclose( FILE *stream );参数指的是文件指针,用完之后,不会自动将FILE *stream,赋值为NULL,需要我们手动操作。下面举个简单的例子。

文件管理【详解归纳】_第1张图片

这里,我们用fprintf函数,将zmh变量的数据,存入庄梦涵.txt文档中

文件管理【详解归纳】_第2张图片

这里,我们将庄梦涵.txt文档里的数据读取到变量lyy中,可能你们又要问,为什么我们不直接在同一个程序进行读和写呢,这里涉及了一个文件缓冲区的问题,如果你直接把if语句里的三条语句都运行,则程序会出错。

五、文件的顺序读写

顺序读写,由字面意思可知读取数据,与输入数据的时候,只能在文件的起始位置进行,这里我们将相关函数列举下。他们的功能呢,其实和我们平常用的putchar,puts,printf等差不多,只不过此时的输出流不在是标准输出流-(键盘)。

字符输入输出函数fputc,fgetc(针对所有输入输出流)

文本行输入输出函数fputs,fgets(针对所有输入输出流)

格式化输入输出函数fscanf,fprintf(针对所有输入输出流)

二进制输入输出函数fread,fwrite (针对文件)

下面我会举些例子,进行对照理解。

1.fread/fwrite

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );第一个参数表示指向带有最小尺寸 size*count字节的内存块的指针(用于接受数据)。第二参数表示要接受元素的大小,第三个表示元素的个数

第四个参数指的是,要操作的流。那我们用键盘也不是不可以哟!

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );第一个参数这是指向要被写入的元素数组的指针。其余的如上,同样:

第四个参数值得是,要操作的流。那我们用屏幕也不是不可以呦!具体实例上代码:

文件管理【详解归纳】_第3张图片

文件管理【详解归纳】_第4张图片

文件管理【详解归纳】_第5张图片

2.scanf/fscanf/sscanf(我暂且把他们的声明列在下面)

int scanf( const char *format [,argument]... );

int fscanf( FILE *stream, const char *format [, argument ]... );第一个参数指的是流。

int sscanf( const char *buffer, const char *format [, argument ] ... );第一个参数指的是字符串

其余参数一样,返回值一样。仔细对比着理解(与其相对应的有printf,fprintf,sprintf)。

六、文件的随机读写

上面介绍的那些函数,只能从起始位置开始,进行读取与写入。那有没有能够随机写入的函数或操作呢?答案是有的

fseek(根据文件指针的位置和偏移量来定位文件指针)

int fseek ( FILE * stream, long int offset, int origin )

ftell(返回文件指针相较于起始位置的偏移量)

long int ftell ( FILE * stream );

rewind(使文件指针回到,文件的起始位置)

void rewind ( FILE * stream );

七、文件读取结束的判定

feof函数-测定给定流的文件结束标识符,其声明:int feof(FILE *stream)。此不能用其返回值来判断文件是否结束。

八、文件缓冲区

文件缓冲区是缓冲文件系统为每一个正在开使用的文件开辟的,从内存向磁盘输入数据时,往往需要先把缓冲区放满,然后一起运到磁盘中。反而过来一样,从中我们可以得到的一个结论是,我们在使用文件的时候,要时刻刷新缓冲区,要不然会造成文件操作错误。

你可能感兴趣的:(javascript,开发语言,ecmascript)