文件的打开与关闭#
1 | FILE *fp; |
Method | 访问形式 | 说明 |
---|---|---|
r | 只读 | 只读不写,不存在则返回 NULL |
w | 只写 | 只写不读,若文件已存在则删去原有内容,否则新建 |
a | 追加写 | 在文件尾部追加数据,若文件不存在则新建 |
r+ | 读写 | 可读可写,不存在则返回 NULL |
w+ | 读写 | 可写可读,若文件已存在则删去原有内容,否则新建 |
a+ | 读与追加写 | 可读,可在尾部追加写,若文件不存在则新建 |
默认在后面附加 t ,即以文本形式打开文件。
若在后面附加 b ,如 "rb", "wb", "r+b" 则以二进制打开
使用完文件后必须关闭,否则可能导致数据丢失。
1 | int fclose(FILE *p); |
文件的读写#
- 字符读
char c; c=fgetc(fp);
- 字符写
int fputc(int c, FILE *p);
- 读字符串函数
fgets(内存区首地址, 读入字符数+1, fp);
如char c[20]; fgets(c, n, fp);
则从 fp 文件中读取 n-1 个字符存入 c - 写字符串函数
fputs(str, fp)
如fputs(c,fp)
则将字符串 c 写入 fp - 判断文件是否结束
feof()
,结束返回非0,否则返回0
数据块读写(适用于二进制文件)#
数据块读 fread()#
size_t fread(void *buffer, size_t size, size_t count,FILE *fp)
解释:
buffer
存放读入数据的内存首地址size
字节数,常用sizeof(data_type)
count
读入数据项个数fp
指向文件
例
1 | int x[4]; |
数据块写 fwrite()#
size_t fwrite(void *buffer, size_t size, size_t count,FILE *fp)
解释同上
例
1 | int x[5]={1,2,3,4,5}; |
格式读写函数#
fscanf()#
类似 scanf
但多一个文件地址 1
2
3
4
5
6
7int a,b;
FILE *fp;
if((fp=fopen("test.txt","r+"))==NULL){
exit(0);
}
fscanf(fp,"%d %d\n",&a,&b);
fclose(fp);
fprintf()#
类似 printf
但多一个文件地址 1
2
3
4
5
6
7
8int a=1;
double b=2.33;
FILE *fp;
if((fp=fopen("test.txt","w+"))==NULL){
exit(0);
}
fprintf(fp,"%d %lf\n",&a,&b);
fclose(fp);
文件定位#
rewind()#
void rewind(FILE *fp)
无返回值,将读写指针移动到开头
fseek()#
void fseek(FILE *fp, long offset, int origin)
origin
移动文件指针的相对起始位置SEEK_SET
or0
:文件首SEEK_CUR
or1
:当前文件读写位置SEEK_END
or2
:文件尾
offset
以origin
为起始点的指针偏移量,类型要求为长整型- 例
fseek(fp,100L,SEEK_SET)
从文件首开始 指针向文件尾移动100字节
- 例
[!warning]
如果成功定位则返回0,否则返回非零,对于不能重定位的设备,返回值不确定
可将指针定位到文件之外,若定位到文件之外,则将清除文件结束符
若以追加方式打开文件,当前文件指针由上次I/O操作决定,若还未进行I/O操作,则指针在开头
若
Ctrl+Z
被作为文件结束符,fopen打开时将会删除该字符,否则会导致fseek()
和ftell()
的定位失常
ftell()#
返回当前文件读写位置(出错则返回 -IL )
long ftell(FILE *fp)
文件缓冲区清除#
fflush()#
int fflush(FILE *fp)
可用于文件缓冲区清除,也可以用于标准输入输出缓冲区清除
why?
文件输入输出要现在缓冲区存放才会写入文件,清除缓冲区的目的是让缓冲区数据写入磁盘文件中
其他#
feek()
rewind()
fclose()
也具备清除缓冲区的功能
指针错误状态清除#
为什么会出现这种情况?
由于读写等操作失败引起文件输入输出缓冲区错误
clearerr()#
void clearerr(FILE *fp)
其他#
建议 clearerr
和 fflush
配对使用
[!warning]
以二进制打开文件仅可用
fread
和fwrite
读写用文本方式打开的文件不应用
fread
和fwrite
读写,而应用fputc, fgetc, fgets, fputs, fscanf, fprintf
等读写简而言之,打开方式与读写函数方式应匹配