注:学习中,记录的笔记
打开文件
FILE *fopen(consr char* pathname, const char* mode);
pathname
表示的是需要打开的文件路径
mode
表示的是要打开的文件的模式
可选的模式:
读写权限
r
: 只读,(打开的文件必须存在,否则报错)
w
: 只写,(打开的文件如果存在,就打开,但是里面的内容清空;如果不存在,则新建文件)
a
: 追加,(如果文件存在,那么将写入的数据追加到文件的末尾;如果文件不存在,则新建文件)
r+
: 读写,(打开的文件必须存在,否则报错)
w+
: 读写,(打开的文件如果存在,就打开,但是里面的内容清空;如果不存在,则新建文件)
a+
: 追加,相当于a
+r+
(如果文件存在,那么将写入的数据追加到文件的末尾;如果文件不存在,则新建文件)
读写方式
t
: 以文本文件的方式打开文件(默认)。
b
: 以二进制的方式打开文件
关闭文件
在代码的最后,一定要关闭文件,避免出错。
fclose(FILE *fp)
以单个字符读取或写入文件
-
fgetc
: 从指定的文件中读取一个字符int fgetc(FILE *fp); // fp是文件指针 // fgetc()读取成功后返回读取到的字符,读取到文件末尾或读取失败时返回 EOF // EOF是定义的宏,一般是 -1
// 举例 char ch; FILE *fp = fopen("1.txt", "r"); ch = fgetc(fp);
-
feof()
: 用来判断文件内部指针是否指向了文件末尾int feof(FILE *fp);
-
ferror()
:用来判断文件操作是否出错int ferror(FILE *fp);
-
fputc()
: 向指定的文件中写入一个字符int fputc(int ch, FILE *fp); // ch是要写入的字符,fp是文件指针。 // fputc() 写入成功时返回写入的字符,失败时返回EOF,返回值类型为 int,
// 举例 char ch = 'a'; fputc(ch, fp);
以字符串的形式读取或写入文件
-
fgets()
: 从指定的文件中读取一个字符串,并保存到字符数组中(每次读取一行)char *fgets(char *str, int n, FILE *fp); // str为字符数组,n为要读取的字符数目,fp为文件指针 // 返回值:读取成功时返回字符数组首地址(str),读取失败时,返回NULL; // 如果开始读取时,文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回NULL
这里的
n
一般来说会设置一个足够大的数,可以一次性读取一行的数据
假设n
不足够大,一次性只读取了一行的一半数据,那么下次读取还是会继续读取这一行的剩下的数据注意: 在读取字符之前如果出现了换行,或者读到了文件末尾,则读取结束。也就是说,
fgets()
最多只能读取一行的数据,不能跨行 -
fputs()
: 向指定的文件中写入一个字符串int fputs(char *str, FILE *fp); str是要写入的字符串,fp为文件指针。写入成功返回非负数,失败返回 EOF
// 举例 char *str = "hello world!"; FILE *fp = fopen('1.txt', "at+"); fputs(str, fp);
以数据块的形式读写文件
fread()
: 从指定的文件中读取块数据(若干个字节的数据)
size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。
fwrite()
: 向文件中写入块数据
size_t fwrite(void *ptr, size_t size, size_t count, FILE *fp);
ptr
: 内存区块的指针,可以是数组、变量、结构体等。fread()中的ptr用来存放读取到的数据,fwrite()用来存放要写入的数据。
size
: 表示每个数据块的字节数
count
: 表示要读写的数据块的块数
fp
: 表示文件的指针
理论上,每次读写size*count个字节的数据
格式化读写文件
- 从文件中读取数据
int fscanf(FILE *stream, const char *format, ...);
stream
表示文件描述符,后面的参数和 scanf()
使用起来一样
返回值:参数列表中被成功赋值的个数
- 将数据写入到文件
int fprintf(FILE *stream, const char *format, ...);
stream
表示文件描述符,后面的参数和 printf()
使用起来一样
返回值:成功写入的字符的个数
随机切换文件内部位置指针的位置
- 将位置指针移动到文件开始
void rewind(FILE *stream);
- 将位置指针移动到任意位置
int fseek(FILE *stream, long offset, int whence);
stream
表示文件描述符
offset
表示偏移量,为正数向后移动,为负数向前移动
whence
表示起始位置,从哪里开始计算偏移量
可选参数:
文件起点 0 SEEK_SET
当前位置 1 SEEK_CUR
文件终点 2 SEEK_END
返回值:0 - 计算当前位置指针距离文件起点的字节数(以二进制打开文件)
返回值:当前的位置指针距离文件起点的偏移量(字节数)long ftell(FILE *stream);
- 获取位置指针的当前位置
需要提前定义int fgetpos(FILE *stream, fpos_t *pos);
fpos_t
变量
返回值:0 - 设置位置指针的当前位置
需要提前定义int fsetpos(FILE *stream, const fpos_t *pos);
fpos_t
变量
返回值:0