函数的声明:
FILE *fopen(const char *path, const char *mode);
函数说明:fopen 函数的功能是打开一个已经存在的文件,并返回这个文件的文件指针(文件的标识)或者创建一个文件,并打开此文件,然后返回文件的标识。
函数的参数:
参数 1:打开的文件的路径
1.绝对路径,从根目录开始的路径名称
“D:\\demo\\test\\aaa.txt”
2.相对路径
.\\test\\aaa.txt
参数 2:文件打开的方式,即以什么样的方式(只读、只写、可读可写等等)打开文件 第二个参数的几种形式(打开文件的方式)
读写权限:r w a +
r:以只读方式打开文件
文件不存在返回 NULL;
文件存在,且打开文件成功,返回文件指针,进行后续的读操作
例 1:
FILE *fp;
fp=fopen(“test.txt”,”r”);
w:以只写方式打开文件
1、文件不存在,以指定文件名创建此文件,并且打开文件; 2、若文件存在,清空文件内容,打开文件,然后进行写操作; 3、如果文件打不开(比如文件只读),返回 NULL
FILE *fp;
fp=fopen(“test.txt”,”w”);
a:以追加方式打开文件
1、文件不存在,以指定文件名创建此文件(同 w)
2、若文件存在,从文件的结尾处进行写操作
说明:
如果不加 a 的话,打开文件的时候读写位置在文件的开始,对文件进行读写的时候都是从文件开始进行读写的。
如果加 a,打开已经存在的文件,读写位置在文件的末尾。
+:同时以读写打开指定文件
模式 | 功能 |
r 或 rb | 以只读方式打开一个文本文件 |
w 或 wb | 以写方式打开文件(使文件长度截断为0字节,创建一个文件) |
a 或 ab | 以追加方式打开文件,即在末尾添加内容,当文件不存在时,创建文件于写 |
r+ 或 rb+ | 以可读、可写的方式打开文件(不创建新文件) |
w+ 或 wb+ | 以可读、可写的方式打开文件(使文件长度为0字节,创建一个字节) |
a+ 或 ab+ | 以追加方式打开文件,打开文件并在末尾更改文件(如果文件不存在,则创建文件) |
返回值:
成功:打开的文件对应的文件指针
失败:返回 NULL
以后调用 fopen 函数的时候,一定要判断一下,打开是否成功。
函数的头文件:
#include
函数的声明:
int fclose(FILE *fp);
函数的说明:
关闭 fp 所代表的文件
注意一个文件只能关闭一次,不能多次关闭。关闭文件之后就不能再文件指针对文件进行读写等操作了。
返回值:
成功返回 0
失败返回非 0
可以通过返回值,来判断关闭文件是否成功。
栗子:
函数声明:
int fgetc(FILE *stream);
函数说明:
fgetc 从 stream 所标识的文件中读取一个字节,将字节值返回
返回值:
以 t 的方式: 读到文件结尾返回 EOF
以 b 的方式:读到文件结尾,使用 feof(文件指针)判断结尾
feof 是 C 语言标准库函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束,则返回非 0 值,否则返回 0(即,文件结束:返回非 0 值;文件未结束:返回 0 值)。
函数的声明:
int fputc(int c, FILE *stream)
函数的说明:
fputc 将 c 的值写到 stream 所代表的文件中。
返回值:
如果输出成功,则返回输出的字节值;
如果输出失败,则返回一个 EOF。
EOF 是在 stdio.h 文件中定义的符号常量,值为-1
注意:打开文件的时候,默认读写位置在文件的开始,如果以 a 的方式打开读写位置在文件的末尾 咱们向文件中读取字节或写入字节的时候,读写位置会往文件的末尾方向偏移,读写多少个字节,读写位置就往文件的末尾方向偏移多少个字节.
栗子:
char *fgets(char *s, int size, FILE *stream);
从 stream 所代表的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了 size-1 个字节停止读取,在读取的内容后面会加一个\0,作为字符串的结尾
返回值:
成功返回目的数组的首地址,即 s
失败返回 NULL
int fputs(const char *s, FILE *stream);
函数功能:
将 s 指向的字符串,写到 stream 所代表的文件中 返回值:
成功返回写入的字节数
失败返回 -1
栗子:
函数的声明:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的说明:
fread 函数从 stream 所标识的文件中读取数据,每块是 size 个字节,共 nmemb 块,存放到 ptr 指向的 内存里
返回值:
实际读到的块数。
栗子:
unsigned int num;
num=fread(str,100,3,fp);
从 fp 所代表的文件中读取内容存放到 str 指向的内存中,读取的字节数为 ,每块 100 个字节,3 块。
返回值 num,
如果读到 300 个字节返回值 num 为 3
如果读到了大于等于 200 个字节小于 300 个字节 返回值为 2 读到的字节数,大于等于 100 个字节小于 200 个字节 返回 1 不到 100 个字节返回 0
函数的声明:
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的说明:
fwrite 函数将 ptr 指向的内存里的数据,向 stream 所标识的文件中写入数据,每块是 size 个字节,共 nmemb 块。
返回值:
实际写入的块数
栗子:
注意:
fwrite 函数是将内存中的数据原样输出到文件中。
fread 函数是将文件中的数据原样读取到内存里。
前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据;
但在实际问题中常要求只读写文件中某一指定的部分,例如:读取文件第 200--300 个字节
为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写实现随机读写的关键是要按要求移动位置指针,这称为文件的定位.
完成文件定位的函数有:
rewind、fseek 函数
1、 rewind 复位读写位置
rewind 函数
void rewind(文件指针);
函数功能: 把文件内部的位置指针移到文件首
调用形式:rewind(文件指针);
栗子:
2、 ftell 测文件读写位置距文件开始有多少个字节
定义函数:long ftell(文件指针);
函数功能:取得文件流目前的读写位置.
返回值:返回当前读写位置(距离文件起始的字节数),出错时返回-1.
栗子:long int length ;
length = ftell(fp);
3、 fseek 定位位置指针(读写位置)
fseek 函数(一般用于二进制文件即打开文件的方式需要带 b) 函数声明:
int fseek(FILE *stream, long offset, int whence);
//int fseek(文件类型指针,位移量,起始点);
函数功能:
移动文件流的读写位置.
参数:
whence 起始位置
文件开头 |
SEEK_SET |
0 |
|
文件当前位置 |
|||
SEEK_CUR |
1 |
||
文件末尾 |
SEEK_END |
2 |
位移量:
以起始点为基点,向前、后移动的字节数,正数往文件末尾方向偏移,负数往文件开头方向
偏移。
栗子:
练习:
将一个未知大小的文件(文本文件)全部读入内存,并显示在屏幕上
参考:fseek |
ftell |
rewind |
fread |
malloc |
1、 打开文件 fopen ,注意用 b 的方式打开
2、 定位文件的读写位置到文件的末尾 fseek
3、 测文件的字节数 len ftell
4、 复位读写位置到文件的开始 rewind
5、 根据第 3 步得到的字节数,申请内存 malloc 注意多申请一个字节存放’\0’6、 从文件中读取内容,存到申请的空间里 fread
7、 最后一个字节变成 ‘\0’
8、 打印读出来的内容到屏幕上 ,printf
9、 关闭文件 fclose
10、释放内存 free