4 文件的读写
文件的打开与关闭
FILE *fp;
fp = fopen("File name", "Method");
Method | 访问形式 | 说明 |
---|---|---|
r | 只读 | 只读不写,不存在则返回 NULL |
w | 只写 | 只写不读,若文件已存在则删去原有内容,否则新建 |
a | 追加写 | 在文件尾部追加数据,若文件不存在则新建 |
r+ | 读写 | 可读可写,不存在则返回 NULL |
w+ | 读写 | 可写可读,若文件已存在则删去原有内容,否则新建 |
a+ | 读与追加写 | 可读,可在尾部追加写,若文件不存在则新建 |
默认在后面附加 t,即以文本形式打开文件。
若在后面附加 b,如 "rb", "wb", "r+b" 则以二进制打开
使用完文件后必须关闭,否则可能导致数据丢失。
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
指向文件
例
int x[4];
FILE *fp;
fp = fopen("test.bat", "rb");
fread(x, sizeof(int), 4, fp);
fclose(fp);
数据块写 fwrite ()
size_t fwrite(void *buffer, size_t size, size_t count,FILE *fp)
解释同上
例
int x[5] = {1, 2, 3, 4, 5};
FILE *fp;
fp = fopen("test.bat", "rb");
fread(x, sizeof(int), 5, fp);
fclose(fp);
格式读写函数
fscanf()
类似 scanf
但多一个文件地址
int a, b;
FILE *fp;
if ((fp = fopen("test.txt", "r+")) == NULL) {
exit(0);
}
fscanf(fp, "%d %d\n", &a, &b);
fclose(fp);
fprintf()
类似 printf
但多一个文件地址
int 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
等读写 简而言之,打开方式与读写函数方式应匹配