打开文件
FILE fopen(const char *filename,const char *mode);
@filename 要打开的文件
@mode 打开的模式
打开的模式有如下:
"r" = "rt"
打开一个文本文件,文件必须存在,只允许读
"r+" = "rt+"
打开一个文本文件,文件必须存在,允许读写
"rb"
打开一个二进制文件,文件必须存在,只允许读
“rb+”
打开一个二进制文件,文件必须存在,允许读写
"w" = “wt”
新建一个文本文件,已存在的文件将被删除,只允许写
"w+" = "wt+"
新建一个文本文件,已存在的文件将被删除,允许读写
“wb”
新建一个二进制文件,已存在的文件将被删除,只允许写
“wb+”
新建一个二进制文件,已存在的文件将被删除,允许读写
"a" = "at"
打开或新建一个文本文件,只允许在文件末尾追写
"a+" = "at+"
打开或新建一个文本文件,可以读,但只允许在文件末尾追写
“ab”
打开或新建一个二进制文件,只允许在文件末尾追写
“ab+”
打开或新建一个二进制文件,可以读,但只允许在文件末尾追写
例:FILE *fp = fopen("file.txt", "w");//新建打开一个文本文件file.text,已存在的文件将被删除,只允许写
二进制文件跟文本文件的区别
很多人不清楚以上的文本文件跟二进制文件的区别是什么,这里我简单的讲一下:
文件只是计算机内存中以二进制表示的数据在外部存储介质上的另外一种方式。对于文本文件来说,它只是一种特殊形式的文件,它存放的每一个字节都可以转换为一个可读的字符而已。
我们执行以下代码
c++中默认的写入跟读取都是用文本的方式,以上是采用文本的形式写入,那么它在内存中储存的值为
a的ASCII码为61,b为62,10为0A,那么我们写入3个字节,为什么地址上会有4个字节呢?
文本的方式是无论是数字还是字符都是先转换成ASCII码然后在存储在内存当中,其次当遇到ASCII码的OA(对应的是换行符)时,会产生OD OA连续的(回车--换行),所以我们写入3个字节,内存当中有4字节。但是值得注意的是,当我们读取的时候,OD-OA也会转换成换行1个字符,虽然内存为4个字节,但是我们读取的仍然是3个字节。
当我们需要在文本方式中写入数字时,需要先把数字转换成其相对应的ASCII码,如:
此时读出来的才是我们想看到的数字98341.
二进制文本是读取不到字符的,他会把所有内存读取出来都是数字,写入什么读出来的就是什么。
当我们用文本/二进制方式写入时,采用二进制/文本方式读取,都会产生乱码。所以我们需要用什么方式写,就用什么方式读。
写入数据
size_t fwrite(const char *buffer,size_t size,size_t count,FILE* stream);
@buffer 写入数据的地址
@size 写入数据中每个字符的大小(以字节为单位,1表示1个字节),如写入“123”表示‘1’,‘2’,‘3’各自的大小1
@count 写入数据的总大小,如“123”,的总大小3.
@stream fopen的实例fp;
C语言对文件的操作使用了缓冲文件系统。系统自动为正在使用的文件开辟一块缓冲区域,我们从内存向磁盘写入需先写入到缓冲区之后。当fopen时,我们向缓冲区写入数据,当缓冲区内数据满了的时候它才会把数据写入到磁盘文件中,否则我们需要关闭(直接叉叉程序或者调用fclose)file程序,否则即使程序执行完毕也不会把缓冲区数据写入到磁盘文件中。
当我们需要频繁的写入数据时,我们并不可能一直fopen,fclose。所以我们可以调用fflush执行。
当我们对文件进行操作的时候,系统都会存在一个文件指针,根据我们的操作来产生偏移。
Int fseek(FILE* stream,long offset, in origin);
@stream fopen的实例fp;
@offset 偏移量
@origin 起始位置
/*origin*/
SEEK_CUR 文件指针当前位置
SEEK_END 文件指针结尾处
SEEK_SET 文件指针开始处
例:fseek(fp,1,SEEK_SET);//文件开始位置偏移1
文件数据读取
size_t fread(void *buffer,size_t size,size_t count,FILE* stream);
@buffer 读取数据后存放的地址
@size 写入数据中每个字符的大小(以字节为单位,1表示1个字节),如写入“123”表示‘1’,‘2’,‘3’各自的大小1
@count 写入数据的总大小,如“123”,的总大小3.
@stream fopen的实例fp;
char ch[100];
例:fread(ch,1,100,fp);//读取fp文件中100个字节到ch中
注意:
当count的大小有100,而实际读取数据的大小不到100时,其他部分许多数据为随机的,是不可读数据,结果则乱码。
如当size_t fread(ch,1,100,fp);//假设fp中的数据为123
则输出为:
123*&……*&%*……&%&……%&……**&……*&……*&
会出现的现象如上,123后面会出现乱码。
解决方法:
1.写入数据“123”时改为“123\0”.
2.调用memset(ch,0,100).//在123后面的数据为空