刷牛客网的C++专项练习时,遇到C文件读写的题目基本都是白给,这块知识是盲区。
c语言文件读写相关函数及文件指针FILE *的定义都在stdio.h头文件里,以下所有操作都需要#include <stdio.h>
一、fopen函数
FILE *fopen( const char *name,const char *mode )
fopen()返回的是一个文件指针,第一个参数是文件名,第二个参数是打开模式,常见模式有:
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件。 |
w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 |
r+ | 打开一个文本文件,允许读写文件。 |
w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
如果文本是二进制格式,需要在模式后加"b"
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
FILE *fp;
//以只读模式打开已有的文本/二进制文件
fp = fopen("txt_file", "r")
fp = fopen("bin_file", "rb")
//以写入模式打开文本/二进制文件
fp = fopen("txt_file", "w")
fp = fopen("bin_file", "wb")
如果以只读模式打开的文件不存在,则返回NULL,表示打开失败
二、flose函数
int flose(FILE *stream),返回0表示关闭成功,否则返回EOF
三、feof函数
int feof(FILE * stream),侦测是否读取到了文件尾,如果到了文件尾返回非零整数,其他情况返回0
四、ftell
long ftell(FILE * stream),取得文件流目前的读写位置,当调用成功时则返回目前的读写位置,若有错误则返回-1
五、fseek
int fseek(FILE * stream,long offset,int whence),用来移动文件流的读写位置
where取值
SEEK_SET从距文件开头offset位移量为新的读写位置
SEEK_CUR 以目前的读写位置往后增加offset个位移量
SEEK_END将读写位置指向文件尾后再增加offset个位移量
//将fp移动到距离开头100字节处
fseek(fp, 100L, SEEK_SET);
//将fp从当前位置向后移动50字节
fseek(fp, 50L, SEEK_CUR);
//将fp从文件尾回移50字节
fseek(fp, -50L, SEEK_END);