C语言文件操作

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值