C语言文件操作
流(文件指针)
一个程序启动的时候会自动创建标准输入流(stdin)、标准输出流(stdout)、标准错误流(stderr)
stdin连接操作系统的标准输入,stdout连接操作系统的标准输出,标准错误流连接显示器(无法重现定向,为了使标准输出流被重定向的时候还能够向屏幕输出错误)。标准输入输出函数是对这些流进行操作。
缓冲区
由于外存的速度很慢,所以一般是采用成块的传递方式,一次传递一批数据。而程序中对数据的使用往往是短时间连续的,为了弥补两者之间的速度差距,人们提出一种技术——开辟一块储存区(数据缓冲区),作为文件与程序之间的传递媒介。程序打开时,系统为其自动分配一个缓冲区,数据传输通过这个缓冲区进行。文件关闭时释放缓冲区。
然而我们在用fgetc()或fputc()时仿佛没有缓冲区,这是一种透明性的思想。
基本用法及其注意事项
代码实现
#include<stdio.h>
int main(void){
FILE *fp;
fp=fopen("1.txt","w");//定向文件指针
if(fp==NULL){
printf("未能成功打开文件");
return 0;
}
//成功打开文件后做啥
fclose(fp);//关闭文件
}
常见错误分析
mode串组合
#include<stdio.h>
int main(void){
FILE *fp;
fp=fopen("1.txt","wr");//定向文件指针,但不能正确打开,因为一个程序一个指针只有一个缓冲区,wr各需要一个,而两个公用时会出错。
/*常见的正确组合如下
1.r+ 读更新,可以对文件读或者写。
2.w+ 写更新,可以读或者写。如果文件存在则丢弃原来内容,从头写
3.a+添加并可读。打开后从文件尾接着写
4.rb 二进制读
5.wb+ 二进制写更新
6.a+b
*/
if(fp==NULL){
printf("未能成功打开文件");
return 0;
}
//成功打开文件后做啥
fclose(fp);//关闭文件
}
读写方式中刷新缓冲区的重要性
#include<stdio.h>
int main(void){
FILE *fp;
fp=fopen("1.txt","r+");
if(fp==NULL){
printf("未能成功打开文件");
return 0;
}
fputc('a',fp);
int c;
fflush(fp);//如果没有这行,执行整个程序之后1.txt会有很多空格,这是因为读和写共用一个缓冲区(里面的东西当做字符串),缓冲区中原来写满的都是\0,现在没有刷新,\0对应0又不是EOF=-1,所以会打印出来,它打印出来也是空格。?
while((c=fgetc(fp))!=EOF){
putchar(c);
}
//fgetc(fp);
int status;
status=fclose(fp);
if(status==EOF) printf("文件未正常关闭\n");
}
应用举例
输入到标准输出的拷贝
#include<stdio.h>
void filecopy(FILE *ifp,FILE *ofp){
int c;
while((c=fgetc(ifp))!=EOF){
fputc(c,ofp);
}
}
int main(int argc,char *argv[]){
FILE *ifp;
char * name=argv[0];
if(argc==1){
filecopy(stdin,stdout);//没有参数,标准输入到标准输出
return 0;
}else{
while(*++argv!=NULL){
if(ifp=fopen(*argv,"r")==NULL){
printf("%s,can not input file %s\n",name,*argv );
}else{
filecopy(ifp,stdout);
fclose(ifp);
}
}
}
}
更多文章欢迎访问我的博客www.chen517.xyz