c:\code\test.txt
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件相关信息(文件名字,文件状态以及当前位置),信息是被保存在结构体FILE的变量中,一个文件一个变量。
FILE的定义
通过FILE*文件指针来维护文件
打开文件:fopen("文件路径","模式");
关闭文件:fclose("文件指针");
FILE*pf=fopen("D:\\code\\test.txt","r");//打开文件模式是只读
//打开成功返回FILE指针,指针指向开辟的结构体FILE变量
//打开失败返回空指针
FILE*pf=fopen("test.txt","r");//相对路径:和源文件在同一目录
FILE*pf=fopen("..\test.txt","r");//在源文件上一级目录
fclose(pf);//关闭文件,参数是FILE*指针
用双横线来防转义。
"r":只读。
"w":清空原来的文件,并写入,如果是无文件就创建。
"a":打开文件,从文件尾改变文件。
"r+":可读和可修改,文件必须存在。
"w+":和"w"一样
"a+":追加文件
fputc(字符,FILE指针):写入字符到文件中
FILE*pf=fopen("D:\\code\\test.txt","w");
fputc('a',pf);
//按顺序写入
fgetc(FlLE*):返回读到的字符的assic码值,读取失败和读取结束都返回EOF
FILE*pf=fopen("D:\\code\\test.txt","r");
int ch=fgetc(pf);
printf("%c",ch);
//fputc和fgetc是逐个字符读写
fputs("字符串",FILE*):写入字符串到文件中
int fputs ( 写入的字符串地址, 文件指针 );
成功返回非负数,失败返回EOF
FILE*pf=fopen("D:\\code\\test.txt","w");//使文件可读
fputs("ahlgaglj\n",pf);
//写入ahlgaglj并换行
fgets:读取文件字符串并写入内存
char * fgets ( 写入的字符串地址, 读取字符数, 文件指针 );
FILE*pf=fopen("D:\\code\\test.txt","r");
char ch[20]={0};
fgets(ch,5,pf);//读取4个字符并放入ch中,并补上
fprintf:输出数据到文件流中
fprintf(文件指针,"输出格式",变量名);
FILE*pf=fopen("D:\\code\\test.txt","w");
int a=0;
int b=0;
fprintf(pf,"%d%d",a,b);//除了多了指针作为第一个参数其他和printf一样
fscanf:从文件流中输出到内存中
fscanf(文件指针,"输出格式",地址);
FILE*pf=fopen("D:\\code\\test.txt","r");
fscanf(pf,"%d%d",&a,&b);//从文件中读取数据
fprintf和fscanf:相当于与程序互动的主体由人变成了文件
数据输入->流->不同对象:屏幕,文件,网络(给他人发信息)。
流就是FILE的结构体。
任何一个c语言程序运行默认打开三个流:
stdin-标准输入(键盘)FILE*(键盘输入数据到内存中)
stdout-标准输出 (屏幕) FILE*(内存输出数据到屏幕上)
stderr-标准错误 (屏幕) FILE*(程序的错误信息到屏幕上)
机器一般自带标准流,不含文件流,所以要手动打开fopen,才能从文件流中输出获取。
以上的函数适应所有的流:如fgetc()即fgetc()可以从文件流获取字符也可以从标准输入输流(用普通指针)出,printf()/scanf()只能用标准输入输出流。
二进制输入输出(只能文件流)
fread/fwrite:以二进制来读写
fwrite(变量地址,操作大小,操作个数,文件指针)
FILE*pf=fopen("D:\\code\\test.txt","wb");\\二进制读写
int a=4;
fwrite(&a,sizeof(a),1,pf);\\把a地址指向的内容写入文件中
\\要写的数据的地址,写入字符的大小,写入数量,目标指针
fread(&a,sizeof(a),1,pf)\\把文件中的内容写入a中
\\读到的数据放入地址,读取数据的大小,读入的数量,
函数scanf/fscanf/sscanf比较:printf/fprintf/sprintf同理
scanf针对标准输入流, fscanf针对所有输入流,sscanf:读取字符串中格式化的数据并写入到内存中
sscanf(buf,”%d”,&a);
//从字符串指向的内容输入到a变量中
fseek:偏移指针
向左偏移为负,向右为正
fseek(pf,1,SEEK_SET);
//指针,偏移量,偏移起始位置
//SEEK_SET:表示当前位置
//每次用fgetc等函数时,指针会自动偏移到下一个字符
SEEK_SET |
Beginning of file |
SEEK_CUR |
Current position of the file pointer |
SEEK_END |
End of file * |
ftell:告诉相对于起始位置的偏移量
ftell(pf);
rewind:使指针返回起始位置
rewind(pf);
数据在内存中以二进制存储,把二进制数据存到文件中就是二进制文件
如果转换为assic码值再存到文件中,就是文本文件。
如果在内存中小端形式,那么二进制文件也是也是小端
fgetc
返回空指针:读取失败而导致读取结束
返回EOF:读到文件为尾而结束
feof:已结束时,判断结束原因
返回假:读取失败结束,还是返回真:文件尾结束
返回值是否小于实际读取个数
系统为内存中为使用的文件开辟文件缓存区。
文件数据->输入/输出缓冲区->内存
当缓冲区满了时或主动刷新缓冲区,文件和内存才进行数据交换。