理学c语言文件的输入输出.docx
- 文档编号:26436656
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:19
- 大小:26.28KB
理学c语言文件的输入输出.docx
《理学c语言文件的输入输出.docx》由会员分享,可在线阅读,更多相关《理学c语言文件的输入输出.docx(19页珍藏版)》请在冰豆网上搜索。
理学c语言文件的输入输出
C语言文件的输入与输出
一.文件指针
每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文什状态及文件当前位置等)。
这些信息是保存在一个结构体变量中的。
该结构体类型是由系统定义的,取名为FILE。
在sudio.h文件中有以下的文件类型声明:
typedefstruct{
shortlevel; /*缓冲区“满”或“空”的程度*/
unsignedflags;/*文件状态标志*/
charfd; /*文件描述符*/
unsignedcharhold; /*如无缓冲区不读取字符*/
shortbsize; /*缓冲区的大小*/
unsignedchar*buffer;/*数据缓冲区的位置*/
unsignedchar*curp; /*指针,当前的指向*/
unsignedistemp; /*临时文件,指示器*/
shorttoken; /*用于有效性检查*/
}FILE;
在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息。
FILE类型的数组:
FILE f[5];定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。
有了文件指针类型,就可以用它来定义文件指针变量,用文件指针变量来访问文件,其形式为:
FILE*指针变量名。
例如:
FILE*fp;其中fp是指向要访问文件的指针变量。
例如,通过文件指针访问text.exe文件,有如下的访问:
FILE*fp;
fp=fopen(“text.exe”,“rb”);
ch=getc(fp);
第一行语句只定义了一个没有指向的文件指针fp,第二行是打开文件text.exe,并同时确定对访问文件的操作方式(此处对访问的文件只进行读操作),这时给文件结构中的成员信息赋值,并使fp指向text.exe文件,第三行是利用文件指针对文件进行操作,操作方式应当与打开文件时确定的方式一致(只读)。
由此可以看出,操作文件过程中不出现对文件结构成员的访问语句。
如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,确定打开方式,利用有关函数对文件指针操作即可。
例如:
下面语句定义了三个文件指针,在程序中就可以处理三个不同的文件。
FILE*fa,*fb,*fc;
二.文件的打开与关闭
2.1文件的打开(fopen函数)
打开文件的首要工作就是要改变文件的标志,使其由闭到开,并且把下面信息告诉编译系统:
①需要打开的文件名,也就是准备访问的文件的名字;
②使用文件的方式(“读”还是“写”等);
③让哪一个指针变量指向被打开的文件。
打开函数的原型是定义在stdio.h头文件中的fopen函数,其格式为:
fopen(“文件名”,“使用文件方式”);
即:
FILE=fopen(“文件名”,“使用文件方式”);
例如:
fp=fopen(“file”,“r”);
它表示,要打开的文件名为file,操作方式为读入,fopen函数返回指向file文件的指针并赋值给指针变量fp,这样fp和文件file就建立了联系。
文件名字符串允许带有路径,使用路径时,路径分隔符是“\”而不是“\\”。
例如:
FILE*fp,*fq;
fp=fopen(“student”,“w”);
fq=fopen(“D:
liuli\student34”,“r”);
以上语句表明,在当前磁盘,当前目录下以只写方式打开一个新文件,并将该文件的内存存储的首地址赋予文件指针fp,再以只读方式打开D盘liuli子目录下名字为student34的已经存盘的旧文件,并将该文件的内存存储的首地址赋予文件指针fq。
注意:
如果fopen函数调用失败,即文件打开失败,fopen函数将返回空指针NULL,NULL在头文件中被定义为0.
文件使用方式及含义
文件操作方式
含义
打开文件方式
“r”
打开一个文本文件
只读
“w”
打开一个文本文件
只写
“a”
打开一个文本文件,向文本文件尾增加数据
追加
“rb”
打开一个二进制文件
只读
“wb”
打开一个二进制文件
只写
“ab”
打开一个二进制文件,向二进制文件尾增加数据
追加
“r+”
打开一个文本文件
读/写
“w+”
建立一个新的文本文件
读/写
“a+”
打开或生成一个文本文件
读/写
“rb++”
打开一个二进制文件
读/写
“wb++”
建立一个新的二进制文件
读/写
“ab++”
打开或生成一个二进制文件
读/写
说明:
(1)用“r”方式打开文件的目的是为了从文件中读取数据,不能向文件写入数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的文件;否则出错。
(2)用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。
如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。
如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立个新文件。
(3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。
但此时该文件必须已存在;否则将得到出错信息。
打开时,位置指针移到文件末尾。
(4)用"r+”、“w+”、“a+”方式打开的文件既可以用来输人数据,也可以用来输出数据。
用"r+”方式时该文件应该已经存在,以便能向计算机输人数据。
用“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。
用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。
(5)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。
出错的原因可能是用"r"方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。
此时fopen函数将带回一个空指针值NULL(NULL在stdio.H头文件中已被定义为0)。
常用下面的方法打开一个文件:
if((fp=fopen("file","r"))==NULL)
{printf("cannotopenthisfile\n");
exit(0);//关闭所有文件,终止正在运行的程序
}
即先检查打开的操作有否出错,如果有错就在终端上输出"cannotopenthisfile"。
exit函数的作用是关闭所有文件,终止正在执行的程序,待用户检查出错误,修改后再运行。
(6)从文本文件中读取数据时,将回车符与换行符两个字符转换为一个换行符。
在向文本文件中写入数据时把换行符转换成为回车和换行两个字符。
在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到磁盘中的数据形式完全一致。
2.2、文件的关闭(fclose函数)
在使用完一个文件后应该关闭它,以防止它再被误用。
“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。
用fclose函数关闭文件。
fclose函数调用的一般形式为:
fclose(文件指针);
例如:
fclosc(fp);
表示关闭由文件指针fp当前指向的文件,收回其占有的内存空间,取消文件指针fp的指向。
如果在程序中同时打开多个文件,使用完后必须多次调用fclose函数将文件逐一关闭。
关闭成功返回值为0;否则返回EOF(-1)。
如果不关闭文件将会丢失数据。
因为,在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。
如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。
用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。
三.文件的读写
1.单个字符的读写操作(fputc()和fgetc())
3.1.1、fputs函数---字符的写操作
用fputc函数可以把一个字符写到磁盘文件中去,其形式为:
fputc(intch,FILE*fp)
其中,ch为输出字符,它可以使一个字符常量,也可以使一个字符变量,fp是文件指针变量,它已经指向一个由函数打开的文件。
函数功能:
将字符(ch的值)输出到fp所指向的文件中去。
如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF.
3.1.2、fgetc函数---字符的读操作
fgetc函数的原型定义在stdio.h头文件中,该函数可以从指定的文件读取一个字符,该文件必须是以读或读写方式打开的。
其格式为:
fgetc(FILE*fp);
fp为文件型指针变量,fgetc函数带回一个字符。
如果读到的是文本文件结束符,函数返回—个文件结束标志EOF(即-1)。
如果想从一个文本文件顺序读入字符并在屏幕上显示出来,常见的读取字符操作为:
ch=fgetc(fp);
while(ch!
=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
注意:
EOF不是可输出字符,因此不能在屏幕上显示。
由于字符的ASCll码不可能小于-1,因此EOF定义为-1是合适的。
当读入的字符值等于-1(即EOF)时,表示读入的已不是正常的字符而是文件结束符。
但以上只适用于读文本文件的情况,并不实用于处理二进制文件,因为读入某一个字节中的二进制数据的值有可能是-l,而这又恰好是EOF的值,这就会出现文件没结束但被判断结束的结果。
为了解决这个问题.采用feof(fp)函数,feof(fp)用来测试fp所指向的文件当前状态是否“文件结束”。
如果是文件结束,函数feof(fp)的值为1(真);否则为0(假)。
如果想顺序读入一个二进制文件中的数据。
可以用从一个二进制文件顺序读入字符:
while(!
feof(fp))
{
ch=fgetc(fp);
…………
}
3.1.3、fputc和fgetc函数使用举例
例1:
函数fputc的应用
#include
#include
voidmain(void)
{FILE*fp; /*定义文件指针*/
charch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{printf("cannotopenfile\n");
exit(0); /*终止程序*/
}
ch=getchar();/*接收输入的第一个字符*/
while(ch!
=‘#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
printf("\n"); /*向屏幕输出一个换行符*/
fclose(fp);
}
运行情况如下:
file1.c(输入磁盘文件名)
computerandc#(输入一个字符串)
computerandc(输出一个字符串)
文件名由键盘输入,赋给字符数组filename。
fopen函数中的第一个参数“文件名”可以直接写成字符串常量形式(如file1.c).也可以用字符数组名,在字符数组中存放文件名(如本例所用的方法)。
本例运行时从键盘输人磁盘文件名“filel.c”,然后输入要写入该磁盘文件的字符"computerandc",“#”是表示输入结束。
程序“computerandc”写到以“filel.c”命名的磁盘文件中,同时在屏幕上显示这些字符。
为了验证computerandc”是否写到以“filel.c”命名的磁盘文件中,我们可以对还磁盘中的内容进行读取操作,在在屏幕上显示磁盘中的内容。
,则有
例2.函数fgetc的应用
#include
#include
voidmain(void)
{FILE*fp;/*定义文件指针*/
charch;
if((fp=fopen("file1.c","r"))==NULL)
{printf("cannotopenfile1.c\n");
exit(0);/*终止程序*/
}
ch=fgetc(fp);
while(!
feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
printf("\n");/*向屏幕输出一个换行符*/
fclose(fp);
}
注:
在stdio.h头文件中,用putc和fputc及用getc和fgetc是一样的。
一般可以把它们作为相同的函数来对待。
2.字符串的读写操作
3.2.1、fgets函数
fgets函数原型定义在stdio.h中,指从指定文件读入一个字符串。
其格式为:
fgets(char*str,intnum,FILE*fp);
其中fp指向被读文件的指针变量,nun-1是读出字符串的字符个数,str是存放读出的字符串的数组名,该函数返回str。
其功能是从指定文件fp中读入若干字符并存入到字符串变量中,当读完num-1个字符或读到一个换行符‘\n’,则结束字符读入。
如果读到换行符结束,此时‘\n’也作为一个字符送入str数组中,同时,在读入的所有字符之后自动加一个‘\0’,因此送到数组中字符串最多占有num个字节,fgets()函数的返回值为str数组的首地址。
如果读到文件末尾或出错,则返回NULL。
3.2.2、fputs函数
fputs函数原型定义在stdio.h中,指写一个字符串到指定文件。
其格式为:
fputs(char*str,FILE*fp);
其中,str是存放写入的字符串的数组名,fp是指向被写入文件的指针变量,该函数的返回值为整型值,操作正确时返回0,操作错误时返回非0值。
3.2.3fputs和fgets使用举例
例3.#include
voidmain()
{
FILE*fpin,*fpout;
chara[10];
fpin=fopen("1.txt","r");
fpout=fopen("2.txt","w");
fgets(a,5,fpin);
fputs(a,fpout);
fclose(fpin);
fclose(fpout);
}
3、数据块读写函数(fread()和fwrite())
3.3.1fwrite()函数---数据快的写操作
fwrite()函数的原型定义在stdio.h头文件中,功能是将一个数据块写入磁盘中,格式为:
fwrite(void*buffer,intsize,intcount,FILE*fp);
其中,buffer是指向写入数据块存放空间的指针,size要输入数据块的字节数,count为要写入多少个以size为长度的数据块的个数。
fp是指向被写入文件的指针。
例如,若文件以二进制形式打开:
fwrite(f,4,2,fp);其中f是—个实型数组名。
此函数从数组f中读取2个4个字节的数据块,存储在fp中。
使用举例:
若有如下结构类型:
structstu
{charname[10];
intnum;
intage;
charaddr[30];
}stud[40];
结构体数组stud有40个元素.每—个元素用来存放一个学生的数据(包括姓名、学号、年龄、地址)。
假设学生的数据已有放在结构体数组stud中.可以用下面的for语句和fwrite函数写入40个学生的数据:
for(i=0;i<40;i++);
fwrite(&stud[i],sizeof(structstu),1,fp);
3.3.2fread()函数---数据块的读操作
fread()函数的原型定义在stdio.h头文件中,功能是将磁盘的一个数据块读到内存中,格式为:
fread(void*buffer,intsize,intcount,FILE*fp);
其中,buffer是指向读入数据块存放空间的指针,size要读入数据块的字节数,count要进行读入多少个以size为长度的数据块的个数。
fp是指向被读入文件的指针。
例如,若文件以二进制形式打开:
fread(f,4,2,fp);其中f是—个实型数组名。
此函数从fp所指向的文件中读入2个4个字节的数据块,存储到数组f中。
使用举例:
若有如下结构类型:
structstu
{charname[10];
intnum;
intage;
charaddr[30];
}stud[40];
结构体数组stud有40个元素.每—个元素用来存放一个学生的数据(包括姓名、学号、年龄、地址)。
假设学生的数据已有放在磁盘文件中.可以用下面的for语句和fread函数读入40个学生的数据:
for(i=0;i<40;i++);
fread(&stud[i],sizeof(structstu),1,fp);
3.3.3数据块读写操作的实例
例4:
从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去
#include
#defineSIZE4
structstudent_type
{charname[10];
intnum;
intage;
charaddr[15];
}stud[SIZE]; /*定义结构*/
voidsave()
{FILE*fp;
inti;
if((fp=fopen("stulist","wb"))==NULL)
{printf("cannotopenfile\n");
return;
}
for(i=0;i if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)! =1) printf("filewriteerror\n");/*出错处理*/ fclose(fp); /*关闭文件*/ } main() {inti; for(i=0;i scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr); save(); /*调用save()保存学生信息*/ } 在main函数中,从终端键盘输入4个学生的数据,然后调用save函数,将这些数据输出到以“slulist"命名的磁盘文件中。 fwfite函数的作用是将一个长度为29字节的数据块送别stulist文件中(一个studenttype类型结构体变量的长度为它的成员长度之和,即0+2+2+15=29)。 运行情况如下: 输入4个学生的姓名、学号、年龄和地址: Zhang100119room_101 Fun 100220room_102 Tan 100321room_103 Ling 100421room_104 程序运行时,屏幕上并无输出任何信息,只是将从键盘输入的数据送到磁盘文件上。 为了验证在磁盘文件"stulist"中是否已存在此数据,可以用以下程序从“stulist”文件中读入数据,然后在屏幕上输出。 例5.#include #defineSIZE4 structstudent_type {charname[10]; intnum; intage; charaddr[15]; }stud[SIZE]; main() {inti; FILE*fp; fp=fopen("stulist","rb"); for(i=0;i {fread(&stud[i],sizeof(structstudent_type),1,fp); printf("%\-10s%4d%4d%\-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);} fclose(fp); } 屏幕上显示出以下信息: Zhang100119room_101 Fun 100220room_102 Tan 100321room_103 Ling 100421room_104 4、格式化读写函数(fprintf()和fscanf()) printf函数、fscanf函数与print函数、scanf函数作用相仿,都是格式化读写函数。 只有一点不同: fprintf和fscanf函数的读写对象不是终端而是磁盘文件。 3.4.1fscanf()函数---格式化读操作 fscanf的格式为: fscanf(FILE*fp,char*format,arg-list); 其中,fp是指向被读入文件的指针变量,format是指向格式化字符串的指针变量,arg-list是参数表。 例如: 将fp指向的文件的数据送入到i和t中,语句如下: fscanf(fp,“%d,%f”,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理学 语言 文件 输入输出