第9章 文 件.docx
《第9章 文 件.docx》由会员分享,可在线阅读,更多相关《第9章 文 件.docx(22页珍藏版)》请在冰豆网上搜索。
![第9章 文 件.docx](https://file1.bdocx.com/fileroot1/2022-10/26/d0eb8c1e-a79a-4472-96bb-cf598db59dec/d0eb8c1e-a79a-4472-96bb-cf598db59dec1.gif)
第9章文件
第9章文件
一、文件
许多程序在实现过程中,依赖于把数据保存到变量中,而变量是通过内存单元存储数据的,数据的处理完全由程序控制。
当一个程序运行完成或终止运行,所有变量的值不再保存。
另外,一般的程序都会有数据输入与输出,如果输入/输出数据量不大,通过键盘和显示器即可方便解决。
当输入/输出数据量较大时,就会受到限制,带来不便。
文件是解决上述问题的有效办法,它通过把数据存储在磁盘文件中,得以长久保存。
当有大量数据输入时,可通过编辑工具事先建立输入数据的文件,程序运行时将不再从键盘输入,而从指定的文件上读入,从而实现数据一次输入多次使用。
同样,当有大量数据输出时,可以将其输出到指定文件,不受屏幕大小限制,并且任何时候都可以查看结果文件。
一个程序的运算结果还可以作为另外程序的输入,进行进一步加工。
例如:
例1将短句”HelloWorld!
“写入磁盘文件
#include
#include
intmain()
{FILE*fp;//定义文件指针
if((fp=fopen("fi.txt","w"))==NULL)//打开文件
{printf("Fileopenerror!
\n");
exit(0);
}
fprintf(fp,"%s","HelloWorld!
");//写文件
if(fclose(fp))//关闭文件
{printf("Cannotclosethefile!
\n");
exit(0);
}
return0;
}
运行程序后,在你所建此程序的目录中,新建一个fi.txt文件,用记事本(或其它文本编辑工具)打开查看,其内容就是”HelloWorld!
“,如图9.1所示。
程序中的fopen()、fprintf()、fclose()是文件操作的函数,在stdio.h中定义。
exit语句是退出,在stdlib.h中定义。
图9.1查看fi.txt文件内容
例2将下列数据写入文件f.dat中,并再将其读出显示到屏幕上。
301101张山91
301102陈启85
301103王亮78
301104郑旦69
301105郭敏80
#include
#include
intmain()
{FILE*fp;//定义文件指针
longnum;//学号
charstname[20];//姓名
intscore;//成绩
if((fp=fopen("f.dat","w"))==NULL)//打开文件
{printf("Fileopenerror!
\n");
exit(0);
}
fprintf(fp,"%s","301101张山91\n301102陈启85\n301103王亮78
\n301104郑旦69\n301105郭敏80\n");//将学生数据写到文件中
if(fclose(fp))//关闭文件注意:
”\“在程序中表示其后面的数据放在下一行。
{printf("Cannotclosethefile!
\n");
exit(0);
}
if((fp=fopen("f.dat","r"))==NULL)//打开文件
{printf("Fileopenerror!
\n");
exit(0);
}
while(!
feof(fp))
{fscanf(fp,"%ld%s%d",&num,stname,&score);//fscanf函数是将数据读入
printf("%ld%s%d\n",num,stname,score);//输出到屏幕上
};
if(fclose(fp))
{printf("Cannotclosethefile!
\n");
exit(0);
}
return0;
}
运行程序后,在你所建此程序的目录中,新建一个f.dat文件。
双击这个文件出现一个小对话框,在小对话框上点击“打开方式”,又出现一个对话框,选择“从列表中选择程序”,点击“确定”,出现“打开方式”对话框,从中选择“记事本”双击,便在屏幕上显示出该文件的信息。
如图9.2所示。
图9.2读取学生成绩文件的内容
程序中调用fscanf()函数,将文件中的数据读入到变量num、stname和score,并通过printf()函数把结果输出到屏幕。
在C语言中,文件最基本的操作有两个:
从磁盘文件中读取信息(读操作)和把信息放到磁盘文件中(写操作)。
为了实现读写操作,首先要定义文件指针,并确定被操作文件的具体文件名,请求系统分配文件缓冲区单元,然后进行文件读写,文件操作完成后关闭文件。
在文件操作中,先定义指向文件的指针,然后通过调用专门的函数来实现文件的所有操作。
下面先介绍文件的打开、关闭、读、写。
1、打开文件
打开文件由标准函数fopen()实现,其一般调用形式为:
Fopen(“文件名“,“文件打开方式”);
说明:
a、该函数有返回值,如果执行成功,函数将返回包含文件缓冲区等信息的FILE结构体地址,赋给文件指针fp。
否则,返回一个NULL(空值)的FILE指针。
b、括号内包括两个参数:
“文件名”和“文件打开方式”。
两个参数都是字符串。
“文件名”指出要对哪个具体文件进行操作,一般要指定文件的路径,如果不写出路径名,则默认与本程序的当前路径相同。
文件打开方式用来确定对所打开的文件将进行是么操作。
表9.1列出了C语言所有的文件打开方式。
从表9.1可知,比如用”r“表示打开一个文本文件并进行读数据操作,”w“表示建立一个新的文本文件,并向该文件进行写数据操作。
二进制文件操作与文本文件操作一样,只不过打开方式的表示多加了个字符”b“做后缀。
表9.1文件打开方式
文本文件(ASCCI)二进制文件
使用方式含义使用方式含义
“r“打开文本文件进行只读“rb“打开二进制文件进行只读
“w“建立新文本文件进行只写“wb“建立二进制文件进行只写
“a”打开文本文件进行追加“ab“打开二进制文件进行写\追加
“r+“打开文本文件进行读/写“rb+“打开二进制进行读/写
“w+“建立新文本文件进行读/写“wb+“建立二进制新文件进行读/写
“a+“打开文本文件进行读/写追加“ab+“打开二进制文件进行读/写/追加
下面两种方法都以读的方式打开abc.txt文件:
fp=fopen(“abc.txt“,”r“);//用字符串常量表示文件
char*p=“abc.txt“;//用字符指针表示文件
fp=fopen(p,”r”);
2、关闭文件
当文件操作完后,应及时关闭它,以防止不正常的操作。
关闭文件通过调用标准函数fclose()实现,其一般格式为:
fclose(文件指针);
该函数将返回一个整数,若该数为0表示正常关闭文件,否则表示无法正常关闭文件,所以关闭文件也应使用条件判断:
if(fclose(fp))
{
printf(“Cannotclosethefile!
\n”);
exit(0);
}
要养成文件使用结束后及时关闭的习惯,一则确保数据完整写入文件,二则及时释放不用的文件缓冲区单元。
3、文件复制
例3已知一个文本数据文件f.dat(例2中建好的文件),请将该文件复制一份,保存到文件f2.dat中,并将f2.dat内容在屏幕上显示出来。
#include
#include
intmain()
{FILE*fp1,*fp2;//定义文件指针
charc='';
longnum;//学号
charstname[20];//姓名
intscore,i=0;//成绩
if((fp1=fopen("f.dat","r"))==NULL)//打开已有的f.dat文件,要读出数据
{printf("Fileopenerror!
\n");
exit(0);
}
if((fp2=fopen("f2.dat","w"))==NULL)//建立f2.dat文件,并打开它,要往里写数据
{printf("Fileopenerror!
\n");
exit(0);
}
while(!
feof(fp1))//只要!
feof(fp1)为真,说明fp1指针还没有指向文件末尾
{c=fgetc(fp1);//将文件的一个字符赋给c
fputc(c,fp2);//将字符复制到f2.dat
}
if(fclose(fp1))//关闭f.dat
{printf("Cannotclosethefile!
\n");
exit(0);
}
if(fclose(fp2))//关闭f2.dat
{printf("Cannotclosethefile!
\n");
exit(0);
}
if((fp2=fopen("f2.dat","r"))==NULL)//打开f2.dat文件,要读出数据
{printf("Fileopenerror!
\n");
exit(0);
}
do//将复制好的f2.dat文件内容再显示到屏幕上
{//fscanf函数是将f2.dat文件中的数据读入到变量中
fscanf(fp2,"%ld%s%d",&num,stname,&score);
printf("%ld%s%d\n",num,stname,score);//将变量内容输出到屏幕上
i++;
}while(i<5);
//这里一共有5行(0-4)输出,所以i<5,而用while(!
feof(fp2))语句控制结束,程序结束不
//了,不知为什么?
可能最后找不到结束符标志,得需要程序给加上一个才行。
if(fclose(fp2))
{printf("Cannotclosethefile!
\n");
exit(0);
}
return0;
}
运行该程序,观察源程序所在目录下是否产生了f2.dat文件,用记事本打开它,可以看到它与f.dat的内容完全相同。
本程序实现了复制文件功能,涉及对两个文件的操作,所以程序定义了两个FILE结构类型的指针,并分别打开了文件f.dat和f2.dat。
在while循环中,只要!
feof(fp1)为真,说明fp1指针还没有指向文件末尾,就反复从文件f.dat中读入字符,并将该字符写入文件f2.dat。
最终把f.dat文件中的字符逐一读出并写入到文件f2.dat,完成文件赋值。
最后分别调用fclose()函数关闭指针fp1和fp2,结束文件操作。
在C语言中,scanf()和printf()函数是针对键盘输入和屏幕输出的标准函数。
C语言为文件的读写操作也定义了一系列标准函数,它们都在”stdio.h“中说明,因此文件操作需要包含有标准I/O的文件:
#include。
文