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_SETor0:文件首SEEK_CURor1:当前文件读写位置SEEK_ENDor2:文件尾
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 等读写 简而言之,打开方式与读写函数方式应匹配