c中文件的读取操作

c中文件的读取操作

“文件(file)”:所谓“文件”是指一组相关数据的有序集合。数据以文件的形式存放在外部介质(一般是磁盘、磁带、光盘等)上,操作系统中是以文件为单位对数据进行管理的,以文件名作为访问文件的标识。

C语言把文件看作一个字节序列,即由一连串的字节组成。根据文件中的数据组织形式,数据文件可分为ASCII码文件和二进制文件。ASCII码文件,又称为“文本文件”(text),其每一个字节存放一个ASCII码。二进制文件,把内存中的数据按其在内存中的存储形式存放在磁盘上。

如:十进制整数10000,在内存中占两个字节,其存放形式是:00100111,00010000。在二进制文件中也按这种方式存放。但是,在ASCII文件中,十进制整数10000存放为31H、30H、30H、30H、30H,占五个字节,它们分别是1、0、0、0、0、0字母的ASCII码。

c中文件的读取,只有通过文件指针,才能调用相应的文件。文件操作的过程:对磁盘文件的操作必须“先打开,后读取,最后关闭”。

下面就是利用文件指针,打开一个文件,以只读的打开方式。
<span style="white-space:pre">	</span>FILE * fp;
	fp = fopen("D://1//123.txt","r");

下面分析下fopen函数中的第二个参数使用文件方式的类别,

使用文件方式

含义

"r"(只读) 为输入打开一个文本文件
"w"(只写) 为输出打开一个文本文件
"a"(追加) 为追加打开一个文本文件
"rb"(只读) 为输入打开一个二进制文件
"wb"(只写) 为输出打开一个二进制文件
"ab"(追加) 为追加打开一个二进制文件
"r+"(读写) 为读/写打开一个文本文件
"w+"(读写) 为读/写创建一个文本文件
"a+"(读写) 为读/写打开一个文本文件
"rb+"(读写) 为读/写打开一个二进制文件
"wb+"(读写) 为读/写创建一个二进制文件
"ab+"(读写) 为读/写打开一个二进制文件

注释:
1、若使用文件方式为“a”,表示向文件尾添加新数据(不删除原有数据),但要求此时文件必须存在,否则出错,但是我在是vs2010中调试,文件不存在,会自动建立一个文件,不会报错,此外只能向文件写数据不能读取文件中的数据。若使用文件方式为“a+”,表示向文件尾添加新数据(不删除原有数据),文件不存在,会自动建立一个文件,不会报错,另外使用这种文件方式,打开的文件即可以用来输入数据,也可以用来输出数据。

2、用"w"方式打开的文件只能用于向该文件写数据。如果原来不存在该文件,则在打开时新建一个文件,如果该文件存在,则先删除该文件(其中的数据肯定删除了),然后重新建立一个新文件。

3、若使用文件方式为“w+”和“w”,如果原来不存在该文件,则在打开时新建一个文件,如果该文件存在,则先删除该文件(其中的数据肯定删除了),然后重新建立一个新文件。

4、若使用文件方式为“r+",该文件必须存在,向文件中写入数据的时候,不会先删除该文件,而是直接覆盖,能覆盖多少就覆盖多少,覆盖不了的先前数据仍然存在文件中。

使用文件方式为“r+”,向文件中存入数据:

int main(void)
{

	FILE * fp;
	if((fp = fopen("D://1//123.txt","r+"))== NULL)
	{
		printf("can not open the file\n");
		exit(0);
	}

	char str[] ="he fei wo yao liu xia1";

	int len = strlen(str);
	for(int i = 0; i < len;i++)
	{
		fputc(str[i],fp);
	}
	fclose(fp);
	return 0;
}


使用文件方式为“r+”,从文件中读出数据
int main(void)
{

	FILE * fp;
	if((fp = fopen("D://1//123.txt","r+"))== NULL)
	{
		printf("can not open the file\n");
		exit(0);
	}

	char ch = fgetc(fp);

	while(ch != EOF)//从文本文件中读取数据

	{
		putchar(ch);

		ch = fgetc(fp);
	}
	fclose(fp);
	return 0;
}

对于文本文件,遇文件尾时返回文件结束标志EOF。对于二进制文件,用feof(fp) 判别是否遇文件尾,feof(fp)=1说明遇文件尾。

从文本文件中顺序读入文件内容,并在屏幕上显示出来,可以用:

 ch = fgetc(fp);
 while(ch != EOF)
 {
    putchar(ch);
  ch = fgetc(fp);
  }

从二进制文件中顺序读入文件内容,可以用:

while(!feof(fp))
{
ch = fgetc(fp);
}
如果在文件中写入数据,如果没有关闭就直接读取文件中的内容,就会出现错误-写好文件后,没有关闭,那么文件指针在最后一个位置,那你在读的时候肯定就是从末尾啊,所以是随机字符,这样会出现乱码。如何纠正,等文件写完数据后,首先关闭文件,再读取文件,即可,如下
fclose(fp);
fp = fopen("D://1//123.txt","r+");

下面介绍读写字符串函数:fgets和fputs:

1、读字符串函数fgets函数
功能:从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针);其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。

注意:

a、在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束,但遇到空格不结束。
 
b、fgets函数也有返回值,其返回值是字符数组的首地址。

int main(void)
{
	FILE *fp;
	char str[12];
	if((fp=fopen("D://1//123.txt","rt"))==NULL)
	{
		printf("Cannot open file !");
		exit(0);
	}

	fgets(str,12,fp);
	printf("%s",str);
	fclose(fp);


	return 0;
}

2、写字符串函数fputs函数
功能:向指定的文件写入一个字符串,其调用形式为: fputs(字符串,文件指针) 其中字符串可以是字符串常量,也可以是字符数组名或指针 变量,例如:fputs(“abcd“,fp);

int main(void)
{
	FILE *fp;
	char ch,st[20];
	if((fp=fopen("D://1//123.txt","a+"))==NULL)
	{
		printf("Cannot open file !");
		exit(0);
	}

	printf("input a string:\n");
	scanf("%s",st);
	fputs(st,fp);
	rewind(fp);//把文件流的指针指向开头的位置
	ch=fgetc(fp);
	while(ch!=EOF)
	{
		putchar(ch);
		ch=fgetc(fp);
	}

	fclose(fp);
	return 0;
}

下面介绍文件中的格式化函数fscanf和fprintf

1、fscanf

a、函数原型:
int fscanf(FILE *fp,char *format,arg_list)
b、功能说明
  将fp指定的文件中的数据按照format指定的格式,输出到变量表列(arg_list)中的相应变量。fscanf遇到空格和换行符就结束。表示遇到空格或者换行符,文件中的相应数据读取结束。
c、注意
文件中的数据以逗号隔开,对应的format中的指定格式也以逗号隔开。此时我在vs2010中运行出现错误。
d、返回值
成功返回读入的参数的个数,失败返回EOF(-1)。
void main()
{
	FILE* fp ;
	if((fp = fopen("D://1.txt","r+"))==NULL)
	{
		printf("can not open the file");
		exit(1);
	}
	int a;
	double b;
	char c[15];
	fscanf(fp,"%d%lf%s",&a,&b,c);

	printf("%d ",a);
	printf("%lf ",b);
	printf("%s ",c);
}

2、fprintf

a、函数原型:
int fprintf(FILE *fp,char *format,arg_list)
b、功能说明
  将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。
fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCⅡ代码形式输出到文本文件中。
c、参数说明
  fp:这是个文件指针,指出要将数据写入的文件。
  format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。

d、返回值

输出的字符数,发生错误时返回一个负值。

void main()
{
	FILE* fp ;
	if((fp = fopen("D://1.txt","wb+"))==NULL)
	{
		printf("can not open the file");
		exit(1);
	}
	int a = 100;
	double b = 6.5;
	char c[15] ="tansheng";
	fprintf(fp,"%d %lf %s",a,b,c);

}

fprintf格式串中之间有空格或者有逗号,则对应在文件中也有相应的空格或逗号。


fprintf和fscanf函数对磁盘文件读写,使用方便,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换为字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprinf和fscanf函数,而用fread和fwrite。







  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值