目录
一、文件的打开和关闭
在c语言里面我们用fopen()和fclose()进行文件的打开和关闭
fopen() 的原型如下
FILE *fopen( const char * filename, const char * mode );
filename所指向的字符串代表了文件名,mode代表打开模式
模式 | 描述 |
---|---|
"r" | 打开一个用于读取的文件。该文件必须存在。 |
"w" | 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 |
"a" | 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 |
"r+" | 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 |
"w+" | 创建一个用于读写的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 |
"a+" | 打开一个用于读取和追加的文件。 |
以上都是以文本的形式打开文件
如果在r、w、a后面加上一个b,如:rb rb+ wb,则文件的打开方式变为二进制
返回值:一个文件指针(实际是一个结构体指针,用来存放文件的相关信息),如果为空,则代表文件打开失败。
fclose()的原型:
int fclose(FILE *stream)
参数是要关闭的文件的指针。
返回值:如果文件成功关闭,则该方法返回零。如果失败,则返回 EOF。
二、文件的读写
所使用的函数如下
函数名 | 功能 |
---|---|
fgetc | 字符输入函数 |
fputc | 字符输出函数 |
fgets | 文本行输入函数 |
fputs | 文本行输出函数 |
fscanf | 格式化输入函数 |
fprintf | 格式化输出函数 |
fread | 二进制输入 |
fwrite | 二进制输出 |
需要注意的是即使文件的输入输出形式,可以类比数据和屏幕的交互
实例
#include <stdio.h>
int main()
{
char a[] = "123456";
char b[] = "456789";
//写入
FILE *pf0 = fopen("1.txt", "w");
fprintf(pf0,"%s",b);
fclose(pf0);
//读取
FILE *pf1 = fopen("1.txt", "r");
fscanf(pf1, "%s", a);
printf("%s", a);
fclose(pf1);
return 0;
}
三、文本文件和二进制文件的区别
二进制文件中的数据以内存中的形式存储,整型/浮点数/字符使用各自的存储方式。
文本文件则根据当前程序使用的编码方式,将所有整型/浮点数/字符,都当做字符一个个写入到文件中
例:128在二进制文件中以整形存储,而在文本文件中以 '1' '2' '8' 三个字符都形式存储。
四、文件的定位
由于文件指针指向的结构体存储的是文件的相关数据,在文件使用的时候会有一个用于定位的变量,我们可以理解为文件指针的位置(实际移动时文件指针本身没有改变)
在输入的时候文件指针的位置会进行偏移,所以即使文件的打开模式为读和写,你使用同一指针先进行写入,会让文件指针的位置指针移向最后,导致在进行读操作时无法读取数据。
同时
FILE *pf0 = fopen("1.txt", "w");
FILE *pf1 = pf0;
这样的操作并不能存储文件指针的位置,因为这两个指针其实指向的是同一结构体(不是文件本身),结构体内部的位置信息改变之后相当于两个文件指针的位置都发生改变。
ftell函数
此函数可以返回当前文件指针的位置相对于文件开始位置的字节数。
long int ftell (FILE *stream)
rewind函数
此函数用于将文件指针移动到文件开头。
void rewind (FILE *fp);
fseek函数
可用于移动文件指针
int fseek(FILE *stream, long int offset, int whence)
参数
- stream -- 文件指针
- offset -- 这是相对 whence 的偏移量,以字节为单位
- whence -- 开始偏移位置。它一般指定为下列常量
常量 | 描述 |
---|---|
SEEK_SET | 文件的开头 |
SEEK_CUR | 文件指针的当前位置 |
SEEK_END | 文件的末尾 |
返回值:移动成功,返回零,否则返回非零值
五、文件缓冲区
在操作系统中,存在一个内存缓冲区,当调用fprintf、fwrite等函数往文件写入数据的时候,数据并不会立即写入磁盘文件,而是先写入缓冲区,等缓冲区的数据满了之后才写入文件。还有一种情况就是程序调用了 fclose 时也会把缓冲区的数据写入文件。
如果在文件读写的程序在运行的过程,中突然关闭程序,而缓冲区里面的数据没有写入就会造成数据的丢失,所以我们就需要另一个函数。
fflush 函数可用于刷新缓冲区(会把缓冲区的数据立即写入文件)
int fflush(FILE *fp);
返回0代表成功,其它代表失败