文件的打开、关闭、读和写,和一些相关函数

        C语言中的文件主要指存放在磁盘上的文件。磁盘文件操作前要打开,处理后要关闭,文件的操作方式主要有,读取文件中的数据到内存中,还有将数据写到文件中,这就是文件的读和写。

        类型名FILE称为文件类型,用FILE定义的指针变量通常称为文件型指针,定义格式为:FILE* 文件型指针名。

FILE *pf;
	pf=fopen("test.txt","r");
    fclose(pf);

        打开文件的函数为:fp=fopen(文件名,使用文件的方式),fp为用户定义的文件类型指针,指向内部数据,即要打开的文件。

        关闭文件fclose(pf);

        文件的使用方式有(文本文件的使用方式)

使用方式含义
"r"只读  打开一个已存在的文本文件,只能读取数据;
"w"只写  打开一个文本文件,只能写入数据;
  如果文件不存在,自动建立一个新文件并接收写入的数据;
  如果文件存在,则删除旧文件,建立一个同名新文件并接收写入的数据;
"a"追加  打开一个已存在的文本文件,只能写入数据并且追加在文件尾部;
"r+"读写  打开一个已存在的文本文件,可以读写数据,也可以写入数据;
"w+"读写  打开一个文本文件,可以读写数据,也可以写入数据;
  如果文件不存在,自动建立一个新文件并接收写入的数据;
  如果文件存在,则删除旧文件,建立一个同名新文件并接收写入的数据;
"a+"读写    打开一个已存在的文本文件,可以读取数据,也可以追加数据到文件尾部

字符的读写函数 

        写字符fputc( ),调用格式为:fputc(ch,fp),将变量ch中的字符写道fp所指向的文件缓冲区的当前位置。

    pf=fopen("test.txt","w");
		fputc('a',pf);

        读字符fgetc( ),调用格式为:fgetc(ch,fp),从fp所指向的文件缓冲区当位置读取一个字符。

    pf=fopen("test.txt","w");
		fputc('a',pf);	
    char ch;
		ch=fgetc(pf);
		printf("%c\n",ch);

字符串读写函数

        写字符串函数用fputs( ),调用格式为:fputs( str, fp),将str所指向的一个字符串,舍去结束标志'\0'后写入fp所指向的文件缓冲区。

	char str[20];
	FILE *pf=NULL;
	char str02[]="123456789";
	char str03[]="abcefg";
    pf=fopen("fputs_buf.txt","a"); 
	if(NULL==pf)
	{
		printf("fputs_buf.txt不存在\n");
	 } 
	else
	{
		//fputs读取成功后,返回值是0
		fputs(str02,pf);
    }

读字符串函数

        读字符串函数用fgets( ),调用格式为:fgets(str , n ,fp),从fp所指向的文件缓冲区当前位置读取n-1个字符,在其后补充一个字符串结束标志' \0 ',组成字符串并存入str指定的内存区。

        总结:单行:1.读够n-1个字符,就会停止 2.如果不够n-1,就的读取实际字符数;多行:遇到换行符,读入换行符后,停止读取后面内容 。

    char str[20];
	FILE *pf=NULL;
	char *p;
    pf=fopen("fgets_buf.txt","r"); 
	if(NULL==pf)
	{
		printf("fgets_buf.txt不存在\n");
	 } 
	else
	{
	    p=fgets(str,8,pf);
	}

数据读写函数

        读/写数据函数处理的文件主要是二进制文件,也可以是文本文件。读写的数据可以是字符型,整型和实型,也可以是结构类型等。

        写数据函数fwrite( ),调用格式:fwrite(buffer,unsigned size,unsigned n,fp),将buffer(缓冲区)指向的n个数据(每个数据的字节为size)写入fp指向的文件。

    FILE *pf=NULL;
	pf=fopen("fwrite.txt","w");//
	char str[100];
	if(NULL==pf)
	{
		printf("write.txt文件不存在\n");	
	}
	else
	{
		char str[]="this is a fwrite test";
		fwrite(str,1,4,pf);
		//printf("str=%s",str);
	} 
	fclose(pf);

        读数据函数fread( ),调用格式:fread(buffer,size,n,fp),将fp所指向的文件缓冲区的当前位置读取n个数据,每个数据的字节数为size,共同组成n个长度为size的数据存入buffer指定的内存区。

	FILE *pf=NULL;
	pf=fopen("fread.txt","r");//
	char str[100];
	if(NULL==pf)
	{
		printf("fread.txt文件不存在\n");	
	}
	else
	{
		fread(str,1,5,pf);
		printf("str=%s",str);

	} 
	fclose(pf);

关于文件的一些其他函数

        fscanf函数和fprintf函数

        fscanf函数只能从文本文件中按格式输入。fscanf函数和scanf函数相似,只是输入的对象是磁盘上文本文件的数据。

FILE *pf=NULL;
	int a,b;
	pf=fopen("test_fscanf.txt","r");
	if(NULL==pf)
	{
		printf("test_fscanf.txt不存在\n"); 
	}
	else
	{
		fscanf(pf,"%d",&a);
		printf("a=%d\n",a);
		a+=100;
		printf("a+100=%d\n",a);	
		
		fscanf(pf,"%d",&b);
		printf("b=%d\n",b);
		b+=100;
		printf("b+100=%d\n",b);	
	}	
	
	fclose(pf);

        fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCII代码形式输出到文本文件中。fprintf函数和printf函数相似,只是输出的内容将按格式存放在磁盘的文本文件中。

FILE *pf=NULL;
	char s01[]="this is the test_fprintf.";
	int a[]={1,2,3,4,5,6,7};
	pf=fopen("test_fprintf.txt","w");
	fprintf(pf,"%s\n",s01);
	int i;
	for(i=0;i<7;i++)
	{
		fprintf(pf,"a[%d]=%d\n",i,a[i]);
	}
		
	fclose(pf);

        sscanf函数和sprintf函数

        类似于scanf和printf 但把字符串*buffer用于输入输出。

        sscanf函数sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。如下,把str01的字符串输入到str02中

	char str01[]="this is test sprintf buf.";
	char str02[100]={0};
	sscanf(str01,"%s",str02);
	printf("%s\n",str01);
	printf("%s\n",str02);

        sprintf函数,sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。最大的作用就是可以连接字符串,如下面的练习题。

        有两个磁盘文件"A"和"B",各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),  输出到一个新文件"c"中去。

void fun02(FILE *pf01,FILE *pf02)
{
	int i,m=0,n=0;
	int j=1;
	int temp;
	int l;
	FILE *pf1=NULL;
	char a[SIZE];
	char b[SIZE];
	char str[SIZE];
	pf01=fopen("第二个文件.txt","r");
		fgets(a,10,pf01);
		fclose(pf01);
	pf02=fopen("第一个文件.txt","r");
		fgets(b,10,pf02);
		fclose(pf02);
	printf("%s\n",a); 	
	printf("%s\n",b); 
	sprintf(str,"%s%s",a,b);
	printf("%s\n",str);
	l=strlen(str);
	m=l;
		for(i=0;i<l;i++)
	{
		for(n=m;n>1;n--)
		{
			if(str[i]>str[j])
			{
				temp=str[i];
				str[i]=str[j];
				str[j]=temp;
			}	
			j++;
		}
		j=i+2;
		m--;
	}
	printf("%s",str);
	pf1=fopen("第三个文件.txt","w");
	fputs(str,pf1);
	
	fclose(pf1);
}

int main()

{
    FILE *pf1=NULL;
	pf1=fopen("第二个文件.txt","w");
	fputs("sjyqbcnma",pf1);	
	fclose(pf1);	
	
	FILE *pf2=NULL;
	pf2=fopen("第一个文件.txt","w");
	fputs("iutwopj",pf2);
	fclose(pf2);		

	fun02(pf1,pf2);

	return 0;
 } 

        fseek函数 :目的是对“指向当前流读写位置的指针”进行偏移设置。(这个函数刚接触,用的很少,以后会继续更新)

        int fseek( FILE *stream, long offset, int origin );
        参数1:文件指针
        参数2:偏移量
        参数3:参考点
        SEEK_SET 0 文件开头 
        SEEK_END 2 文件末尾 
        SEEK_CUR 1 文件当前位置 

    FILE *pf=NULL;
	char str01[100]={0};
	pf=fopen("ts_fseek.txt","r");
	fgets(str01,19,pf);
	printf("%s\n",str01);	

	fseek(pf,5,SEEK_SET);//距离文件开头 
	fgets(str01,19,pf);
	printf("%s\n",str01);
	
	fseek(pf,-5,SEEK_END);
	fgets(str01,19,pf);
	printf("%s\n",str01);

         ftell()函数

        函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。ftell 使用场景 : 随机方式存取文件时 , 使用 fseek 函数来回移动指针 , 不容易确定当前指针位置 , 通过调用 ftell函数确定指针位置 ;

FILE *pf=NULL;
	char str01[]="this is test rewind.";
	char str02[100];
	pf=fopen("ts_rewind.txt","w+");
	fputs(str01,pf);
	
	printf("ftell()返回光标距离开始的位置:%d\n",ftell(pf)); 
	rewind(pf);//重置光标 ,将光标位置移动到开始位置 
	printf("ftell()返回光标距离开始的位置:%d\n",ftell(pf));
	fgets(str02,20,pf);
	printf("ftell()返回光标距离开始的位置:%d\n",ftell(pf));
	printf("str02=%s\n",str02); 
	
	fclose(pf); 

         重置光标前用ftell查看一下,重置后,再看一下 。

         这段代码也使用到了rewind函数,rewind函数的功能:重置光标 ,将光标位置移动到开始位置 (将文件内部的位置指针重新指向一个流(数据流/文件)的开头)。

        关于文件还有一些函数,如ferror,feof,待我搞明白了会继续更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值