C学习记录9——文件
一、文件概述
1.磁盘文件与设备文件
磁盘文件:一组相关数据的有序集合,通常存在外部介质上,使用时才调入内存。
设备文件:在操作系统中把每个与主机相连的输入输出设备看作一个文件,把它们的输入、输出等同于对磁盘文件的读、写。
2.磁盘文件的分类
- 文本文件:基于字符编码如ASCII、Unicode
- 二进制文件:基于值编码,根据具体应用,指定值序号
一般可用文本编辑器直接打开
二、文件的打开和关闭
1.文件指针
FILE是系统用typedef定义的结构体类型(在<stdio.h>中),含文件名、文件状态、文件当前位置等信息。
C中有三个特殊文件指针系统默认打开,可直接使用:
- stdin:标准输入,默认为当前终端(键盘)scanf、getchar
- sidout:标准输出,默认屏幕 printf、puts
- stdeer:标准出错,默认屏幕 perror
2.文件打开
FILE* fp = fopen("路径+文件名","打开模式");
路径中的\
需要用/
代替
打开模式:"r"只读
3.文件关闭
- 文件打开后不关会占内存
- 一个进程同时打开文件数量有限(65535,unsigned short最大值),超出则打开无效
- 若未关闭文件,程序退出时,操作系统同一关闭
fclose(fp);
fp为文件指针
三、文件的顺序读写
1.按字符读写文件fgetc()、fputc()
1)读
char ch;
ch = fgetc(fp); //不能改文件指针,文件读取时光标流会自动向下移动
printf("%c\n",ch);
2)文件结尾EOF
EOF(end of file)表示文件结束(文本文件),或表示一个无效字符
EOF值为-1,(可用于while条件)
feof(文件指针);
判断文件是否结束(二进制文件、文本文件均可),返回非0,已结尾;0,未结尾。
3)写
char ch = 'a';
fputc(ch,fp); //返回输入的字符
要以写(“w”)的形式打开文件,若文件不存在会创建新文件,若文件存在,会清空内容
4)行读写 fgets()、fputs()
2.文件格式化读写fprintf()、fscanf()
int a,b,c;
fscanf(fp,"%d%d%d\n",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
fprintf(fp,"%d%d%d\n",1,2,3);
3.块读写文件fread、fwrite
对二进制文件;bat 批处理文件
fwrite(&a,sizeof(int),1,fp);
读取/写入数据地址,块数据大小,块数,打开的文件指针
fread(&b,sizeof(int),1,fp);
输出时可以块数据大小为1,块数为4,也可以块数据大小为2,块数为2,只要保证整体大小相同即可
4.获取文件状态
#include <sys/types.h>
#include <sys/stat.h>
stat(文件名(路径),保存文件信息的结构体指针&st);
struct stat st;
5.文件随机读写
fseek(fp,偏移量,whence);
移动光标位置
偏移量:+左,-右,单位字节
左移超过开头出错,右移超过末尾,再次写入时增大文件尺寸
whence:SEEK_SET:从文件开头 0
SEEK_CUR:从当前位置 1
SEEK_END:从文件末尾 2
long ftell(FILE * stream);
获取文件流(光标)读写位置
rewind(fp);
将光标移至文件开头
6.删除文件,重命名文件
remove(fp);
返回0,删除成功(不进回收站)
rename(fp,newpath);
重命名
注意路径(改变路径可实现移动、剪切功能)
更新缓冲区(不要频繁,频繁与硬盘交换,会损伤硬盘)
fflush(fp);
让缓冲区数据立马写入文件中