C语言文件指针,如何对文件进行操作,文件指针FILE,指向文件指针

x33g5p2x  于10个月前 转载在 其他  
字(8.0k)|赞(0)|评价(0)|浏览(136)

C语言文件的定义,如何对文件进行操作,文件指针,如何定义指向文件的指针,通过文件指针对文件进行操作,文件应用举例,二进制文件相关操作,文件定位

一、什么是文件

1、文件的定义:文件是相关信息的集合
信息:
文字、文件的扩展名为:txt,doc
声音、文件的扩展名为:mp3,wav,wma
图像、文件的扩展名为:bmp,jpg,gif
视频、文件的扩展名为:AVI、mov、rmvb、rm、FLV、mp4、3GP
2、文件的取名:
主文件名.扩展名
1234563.txt
3、文件的分类(在C程序当中对文件的分类)
A:文本文件(存放字符/文字的文件.txt)
B:二进制文件(.data)把结构体的信息写入的文件被称为二进制文件

二、C程序对文件的操作

读操作:从文件里面把文件的内容取出来,并输出到屏幕(不会改变文件的内容)
写操作:把一些内容往文件里面写入(会改变文件的内容)

1、C程序对文件的操作

C程序通过文件的指针并加上一些函数然后对文件进行操作的

2、什么是文件指针

文件指针:这个指针是用来存放文件的首地址。这个指针是专门用来指向文件的。

3、如何来定义文件指针

格式:

FILE *指针名;

比如:定义了一个指针为fp,这个指针以后只能指向文件,之后要把文件的首地址赋值给该指针

FILE *fp;
4、如何给文件指针赋予初值

如何赋值:一般通过fopen这个函数对指针进行赋值
fopen功能
A:打开文件。
B:同时会返回打开的那个文件的首地址。
C:该函数实际上就是地址。
格式

fopen("要打开的文件名","打开方式");

说明:
1、打开方式是表明打开文件之后要读还是要写
2、打开方式:

r:要打开文件之后要读文件(read) 文本文件
w:要打开文件之后要写文件(write) 覆盖
a:要打开文件之后要追加文件(append) 把新的数据加到末尾
rb:要打开二进制文件进行读
wb:要打开二进制文件进行写

如果打开方式中加了一个"b"就表示要对二进制文件进行操作

3、如果打开的文件名的路径当中含义 \ 的时候就要用双杠 \ \ 。

fopen("c:\\chen\\My.txt","r");//打开My.txt这个文本文件进行读的操作。

使用文件指针
打开文件

FILE *fp;
//fopen该函数返回的是文件的地址
fp=fopen("要打开文件的名称。即包含文件名的路径","打开方式");

关闭文件
A:通过fopen函数能够打开文件,之后对文件进行操作。
B:操作完毕之后,一定要关闭文件。
C:格式:fclose(文件指针名);

程序操作文件的一般格式:

FILE *fp;//定义一个文件指针
fp=fopen("打开文件名","打开方式");//把文件指针具体的去指向一个文件
//然后对文件进行操作
fclose(fp);//要关闭文件

4、对文件操作的函数:

1)fgetc函数
功能:从fp所指向的文件里面读取出一个字符。 (r)
格式:字符型变量=fget(fp); //fp是一个文件指针
文件一定要以读的方式打开,之后指针会自动向后移动一个位置

2)fputc函数:
功能:从fp所指向的文件里面写入一个字符。 (w)
格式:fputc(要写入的字符,fp);
文件一定要以写的方式打开,之后指针会自动向后移动一个位置

3)fgets函数:
功能:从fp所指向的文件里面读取出来一个字符串
格式:fgets(str,n,fp);它会读出n-1个字符,留一个字符为\0
str:存放字符串的一个数组,n表示读取出来字符的个数,fp是文件的指针

4)fputs函数
功能:把字符串写入到fp和指向的文件当中去
格式:fputs(str,fp);把str当中所有的字符写入到fp里面去

5)专门用来对二进制文件进行操作
A:fwrite函数
功能:把一个结构体变量当中的信息以二进制的形式写入到指定的文件当中去
格式:fwrite(&结构体变量名,sizeof(结构体类型),1,fp);
B:fread函数
功能:从fp所指向的文件当中读出一条信息,存放在一个结构体变量当中
格式:fread(&结构体变量名,sizeof(结构体类型),1,fp);

6) feof函数
功能:判断指向文件的指针是否指向文件的末尾
格式:feof(文件指针);返回1则代表指向了文件的末尾,返回0则代表没有指向文件末尾
feof(fp);
一般的用法:while(!feof(fp));
//(!feof(fp))返回0则代表指向了文件的末尾,返回1则代表没有指向文件末尾

三、对文件进行操作的案例

1、对文件进行读取操作

1)从文件当中读取一个字符
ch=fgetc(fp); //表示从fp指向的文件当中指向一个字符 ,并存放到变量ch里面
A:新建一个txt文件

B:

#include<stdio.h> 
void main(){
	FILE *fp;
	char ch; 
	fp=fopen("c:\\chen\\My.txt","r");//要以读的方式打开一个文本文件,并让指针fp指向这个文件
	ch=fgetc(fp); //表示从fp指向的文件当中指向一个字符 ,并存放到变量ch里面
	printf("%c",ch); 
	//一定要关闭文件
	fclose(fp);
}

2)如何从一个文件当中把所有的都读取出来
当文件没有读完时反复的读取文件当中的字符
A:如何判断一个文件指针是否到了末尾
feof函数:能够判断指针是否到文件的末尾
格式:feof(指向文件的指针);

feof(fp);

该函数返回值为0时没有到末尾
如果返回值为1表示到了末尾
一般:
while(!feof(fp))//当不到末尾

#include<stdio.h> 
void main(){
	FILE *fp;
	char ch; 
	//要以读的方式打开一个文本文件,并让指针fp指向这个文件
	fp=fopen("c:\\chen\\My.txt","r");
	while(!feof(fp)){//当不到文件末尾时就反复的读取 
	ch=fgetc(fp); //表示从fp指向的文件当中指向一个字符 ,并存放到变量ch里面
	printf("%c",ch); 
	}
	//一定要关闭文件
	fclose(fp);
}

2、对文件进行写的操作

1)向文件当中写入单个字符
A:创建一个文件

#include<stdio.h> 
void main(){
	FILE *fp;
	char ch;
	fp=fopen("c:\\chen\\You.txt","w");
	ch='A';
	fputc(ch,fp);
	fclose(fp);
}

2)向文件当中写入多个字符(覆盖)
用户输入字符,然后将用户输入的字符写入到对应的文件当中

#include<stdio.h> 
void main(){
	FILE *fp;
	char ch[100];
	fp=fopen("c:\\chen\\You.txt","w");//覆盖旧的字符
	printf("请输入一个字符串:");
	gets(ch); 
	int i; 
	for(i=0;ch[i];i++){
		fputc(ch[i],fp);//将用户输入的文字写入到fp指向的文件当中 
	}
	fclose(fp);
}

3)向文件当中写入多个字符(追加)

#include<stdio.h> 
void main(){
	FILE *fp;
	char ch[100];
	fp=fopen("c:\\chen\\You.txt","a");//a为追加
	printf("请输入一个字符串:");
	gets(ch); 
	int i; 
	for(i=0;ch[i];i++){
		fputc(ch[i],fp);//将用户输入的文字写入到fp指向的文件当中 
	}
	fclose(fp);
}

3)fgets函数:的用法

#include<stdio.h> 
void main(){
	FILE *fp;
	char str[100];
	fp=fopen("c:\\chen\\My.txt","r");//以读的方式将文件的地址值赋予指针fp
	fgets(str,5,fp); //从fp指向的文件当中地区5个字符,放入到str字符数组当中 
	puts(str);//输出字符数组 
	fclose(fp);
}

fgets(str,f,np);它会读出n个字符,留一个字符为\0,所以器实际字符串的长度为n-1,读取出来的字符串为n-1个

4)fputs函数:的用法

#include<stdio.h> 
void main(){
	FILE *fp;
	char str[100]={"abcd1235"};
	fp=fopen("c:\\chen\\My.txt","w");//以写的方式将文件的地址值赋予指针fp
	fputs(str,fp);
	fclose(fp);
}

5)专门用来对二进制文件进行操作
A:fwrite函数:的用法
功能:把一个结构体变量当中的信息以二进制的形式写入到指定的文件当中去
格式:fwrite(&结构体变量名,sizeof(结构体类型),1,fp);

向文件当中输入单个结构体变量

#include<stdio.h> 
typedef struct worker{
	char Id[10];
	char Name[10];
	int Age;
}WOR;//结构体类型为WOR 
void main(){
	FILE *fp;
	WOR w[5]={
		{"w1","张三",34},
		{"w2","李四",54},
		{"w3","二狗",64},
		{"w4","狗娃",74},
		{"w5","小样",84}
	};
	fp=fopen("c:\\chen\\worker.data","wb");//以写入的方式打开一个二进制文件用fp指向该文件的首地址值 
	fwrite(&w[0],sizeof(WOR),1,fp);//通过fwrite函数对文件进行写入 
	fclose(fp);//关闭文件 
}

运行以后

向文件当中输入多个结构体变量

#include<stdio.h> 
typedef struct worker{
	char Id[10];
	char Name[10];
	int Age;
}WOR;//结构体类型为WOR 
void main(){
	FILE *fp;
	WOR w[5]={
		{"w1","张三",34},
		{"w2","李四",54},
		{"w3","二狗",64},
		{"w4","狗娃",74},
		{"w5","小样",84}
	};
	int i; 
	fp=fopen("c:\\chen\\worker.data","wb");//以写入的方式打开一个二进制文件用fp指向该文件的首地址值 
	for(i=0;i<5;i++){
		fwrite(&w[i],sizeof(WOR),1,fp);//通过fwrite函数对文件进行写入
	}
	fclose(fp);//关闭文件 
}

文件里面的样子

B:fread函数
功能:从fp所指向的文件当中读出一条信息,存放在一个结构体变量当中
格式:fread(&结构体变量名,sizeof(结构体类型),1,fp);
从二进制文件当中读取单行内容

#include<stdio.h> 
typedef struct worker{
	char Id[10];
	char Name[10];
	int Age;
}WOR;//结构体类型为WOR 
void main(){
	WOR w; 
	FILE *fp;
	//打开一个二进制文件进行读
	fp=fopen("c:\\chen\\worker.data","rb");
	//将fp指向的二进制文件读取到的内容放入到结构w当中
	fread(&w,sizeof(WOR),1,fp); 
	printf("%s\t%s\t%d",w.Id,w.Name,w.Age);
	fclose(fp);	 
}

从二进制文件当中读取多行内容

#include<stdio.h> 
typedef struct worker{
	char Id[10];
	char Name[10];
	int Age;
}WOR;//结构体类型为WOR 
void main(){
	WOR w; 
	FILE *fp;
	fp=fopen("c:\\chen\\worker.data","rb");//打开一个二进制文件进行读
	while(!feof(fp)){//判断文件的指针是否到达文件的末尾 
		fread(&w,sizeof(WOR),1,fp);//将fp指向的二进制文件读取到的内容放入到结构w当中 
		printf("%s\t%s\t%d\n",w.Id,w.Name,w.Age);
	}
	fclose(fp);	 
}

四、文件定位

1、文件指针的定位
2、当文件刚刚打开的时候,文件指针会自动的指向文件的开头
3、随着我们调用读写函数文件指针也会自动的向后移动

4、有时候为了编程需要,我们可能要通过程序手动的去移动文件指针
5、文件定位函数:

A:fseek函数
功能:用来移动文件指针到文件的某一个位置
格式:fseek(fp,移动的距离【位移量】,参考点【起始点】);
参考点
SEEK_SET:从文件的开始的位置
SEEK_END:从文件的末尾
SEEK_CUR:文件的当前位置

位移量
正数表示向文件的末尾移动
为负数表示向文件的开头方向移动

案例一、

证明每次调用fgetc指针都会自动向后移动一位

#include<stdio.h> 
#include<string.h>
void main(){
	FILE *fp;
	char ch,ch1; 
	//以读的方式打开文件,并将文件指针fp指向文件的开头
	fp=fopen("c:\\chen\\My.txt","r"); 
	ch=fgetc(fp);//表示从文件里面读取一个字符
	ch1=fgetc(fp);//表示从文件里面读取一个字符
	printf("%c,%c",ch,ch1); 
	fclose(fp);
}

案例二、

SEEK_SET:从文件的开始的位置

#include<stdio.h> 
#include<string.h>
void main(){
	FILE *fp;
	char ch; 
	//以读的方式打开文件,并将文件指针fp指向文件的开头
	fp=fopen("c:\\chen\\My.txt","r"); 
	fseek(fp,2,SEEK_SET);
	ch=fgetc(fp);//表示从文件里面读取一个字符
	printf("%c",ch); 
	fclose(fp);
}

fseek(fp,2,SEEK_SET);//表示以开始的位置(SEEK_SET)将指向文件的指针(fp)向后移动动两个位置

改进上方算法练习
SEEK_CUR:文件的当前位置

#include<stdio.h> 
#include<string.h>
void main(){
	FILE *fp;
	char ch; 
	//以读的方式打开文件,并将文件指针fp指向文件的开头
	fp=fopen("c:\\chen\\My.txt","r"); 
	fseek(fp,2,SEEK_SET);//表示以文件当前的位置开始为参考点向尾部移动2个单位 
	ch=fgetc(fp);//表示从文件里面读取一个字符
	printf("%c",ch); 
	fseek(fp,1,SEEK_CUR);//以当前的位置为参考点,向后移动一个单位 
	ch=fgetc(fp);//表示从文件里面读取一个字符
	printf("%c",ch); 
	fclose(fp);
}

改进上述算法
SEEK_END:从文件的末尾

#include<stdio.h> 
#include<string.h>
void main(){
	FILE *fp;
	char ch; 
	//以读的方式打开文件,并将文件指针fp指向文件的开头
	fp=fopen("c:\\chen\\My.txt","r"); 
	fseek(fp,-2,SEEK_END);//表示以文件末尾的位置开始为参考点向头部移动2个单位 
	ch=fgetc(fp);//表示从文件里面读取一个字符
	printf("%c",ch); 
	fclose(fp);
}

四、rewind函数:

功能:把文件指针移动带开头
格式:rewind(指向文件的指针);
rewind(fp);相当于fseek(fp,0,SEEK_SET);//以文件开头文基准向后移一个单位

#include<stdio.h> 
#include<string.h>
void main(){
	FILE *fp;
	char ch; 
	//以读的方式打开文件,并将文件指针fp指向文件的开头
	fp=fopen("c:\\chen\\My.txt","r"); 
	ch=fgetc(fp);//表示从文件里面读取一个字符,并且指针会自动指向下一个位置 
	printf("%c",ch); 
	rewind(fp);会把指针移动到开头 
	ch=fgetc(fp);//表示从文件里面读取一个字符,并且指针会自动指向下一个位置 
	printf("%c",ch); 
	rewind(fp);//要把指针移动到开头 
	fclose(fp);
}

#include<stdio.h> 
#include<string.h>
void main(){
	FILE *fp;
	char ch; 
	//以读的方式打开文件,并将文件指针fp指向文件的开头
	fp=fopen("c:\\chen\\My.txt","r"); 
	ch=fgetc(fp);//表示从文件里面读取一个字符,并且指针会自动指向下一个位置 
	printf("%c",ch); 
	
	
	//rewind(fp);//会把指针移动到开头 
	fseek(fp,0,SEEK_SET);//会把指针移动到开头 
	
	
	ch=fgetc(fp);//表示从文件里面读取一个字符,并且指针会自动指向下一个位置 
	printf("%c",ch); 
	rewind(fp);//要把指针移动到开头 
	fclose(fp);
}

相关文章