2.5 文件存取操作函数
除了文件的读取和定位操作外,C语言还提供了文件的存取操作,比如,关闭文件、将缓冲区的内容写入文件、打开文件、删除文件、重命名文件等。
2.5.1 fclose函数──关闭文件
1.函数原型
int fclose(FILE *stream);
2.函数功能
fclose函数的功能是关闭stream指定的文件,并将缓冲区的内容全部写入该文件。
3.函数参数
参数stream:文件指针,指向文件对象。
4.函数的返回值
如果调用成功,则函数返回0;否则,函数返回一个非0值。
5.函数范例
/********************************************
*范例编号:02_25
*范例说明:使用fclose函数关闭指定的文件
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main()
04 {
05 FILE *fp;
06 if((fp=fopen(“mytest.dat”,”rb”))==NULL)
07 {
08 printf(“无法打开文件.\n.”);
09 exit(-1);
10 }
11 if(fclose(fp))
12 {
13 printf(“打开文件失败.\n”);
14 exit(-1);
15 }
16 else
17 printf(“打开文件成功.\n”);
18 system(“pause”);
19 }
该函数范例的运行结果如图2-24所示。
图2-24 函数范例的运行结果
6.函数解析
在使用完文件后,需要使用fclose函数将文件关闭,这样可以将缓冲区的数据写入文件,避免数据丢失。
2.5.2 fflush函数──将缓冲区的内容写入文件
1.函数原型
int fflush(FILE *stream);
2.函数功能
fflush函数的功能是将缓冲区的内容写入stream指定的文件中。如果stream指向输入文件,则缓冲区的内容被清除。
3.函数参数
参数stream:文件指针,指向文件对象。
4.函数的返回值
如果调用成功,则函数返回0;否则,函数返回一个非0值。
5.函数范例
/********************************************
*范例编号:02_26
*范例说明:将缓冲区的数据写入指定文件中
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main()
04 {
05 FILE * fp;
06 char readbuf[81],writebuf[]=”Computer Science.”;
07 fp = fopen (“mytest.txt”,”w+”);
08 if (!fp)
09 printf (“打开文件失败!”);
10 else
11 {
12 fputs (writebuf,fp);
13 fflush (fp);
14 rewind(fp);
15 fgets (readbuf,80,fp);
16 printf(“从文件中读取的内容:%s\n”,readbuf);
17 fclose (fp);
18 }
19 system(“pause”);
20 }
图2-25 函数范例的运行结果
该函数范例的运行结果如图2-25所示。
6.函数解析
(1)在一个文件中使用fflush函数时,如果该文件是输入文件,则在关闭之前将缓冲区的数据清空。如果是输出文件,则将缓冲区的数据写入该文件。
(2)在对文件执行了写入操作后,如fputs (writebuf, fp),实际上是先将要写入的数据暂存在缓冲区,在关闭文件或缓冲区满时才会将数据写入文件,使用fflush函数就会将数据立即写入文件。在读取数据之前,要注意文件位置指针的位置。
(3)如果使用了关闭文件操作,就不需要使用fflush函数。
2.5.3 fopen函数──打开文件
1.函数原型
FILE *fopen(const char *filename,const char *mode);
2.函数功能
fopen函数的功能是打开由filename指向的文件,具体的操作类型由mode定义。
3.函数参数
(1)参数filename:一个字符串,由有效的文件名构成,可以是一个完整的路径。
(2)参数mode:文件的打开模式,如以读取还是以写的方式打开。参数mode的取值及含义如表2-9所示。
表2-9 mode的取值及含义
以”r”的方式打开文件时,表示只能从该文件中读取数据,并且保证要打开的文件已经存在,否则将产生错误。
以”w”的方式打开文件时,表示只能向文件中写数据。如果原来不存在该文件,则以指定的文件名创建新文件。如果该文件已经存在,则打开文件时原来的数据将被删除。
以”a”的方式打开文件时,表示在原文件末尾追加数据。如果打开的文件不存在,则创建该文件。
以”r+””w+””a+”的方式打开文件时,既可以从该文件中读取数据,也可以向文件中写入数据。以”r+”的方式打开文件时,必须保证该文件是存在的。以”w+”的方式打开文件时,先创建文件然后写入数据。以”r+”的方式打开文件时,原来的文件不被删除,在原来的文件末尾追加数据。
以”rb””wb””ab””rb+””wb+””ab+”的方式打开的文件是二进制文件,以”r””w””a””r+””w+””a+”的方式打开的文件是文本文件。
4.函数的返回值
如果调用成功,则打开文件关联的文件类型指针;否则,函数返回一个NULL。
5.函数范例
/********************************************
*范例编号:02_27
*范例说明:打开文件
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main()
04 {
05 FILE *fp;
06 char buf[81]=”C programmer”;
07 fp=fopen (“file.txt”,”w”);
08 if (fp==NULL)
09 printf(“Open file error!”);
10 else
11 {
12 fwrite (buf,1,80,fp);
13 fclose (fp);
14 }
15 system(“pause”);
16 }
该函数范例生成的文件file.txt中的内容如下。
C programmer
6.函数解析
(1)在对文件进行读/写操作之前,必须使用fopen函数打开要操作的文件。
(2)在打开文件之后,要判断文件是否被成功打开,可以对fopen函数的返回值进行判断。
2.5.4 remove函数──删除文件
1.函数原型
int remove(const char *filename);
2.函数功能
remove函数的功能是删除由filename指向的文件。
3.函数参数
参数filename:一个字符串,由有效的文件名构成,可以是一个完整的路径。
4.函数的返回值
如果该文件被成功删除,则函数返回0;否则,返回非0值。
5.函数范例
/********************************************
*范例编号:02_28
*范例说明:删除文件
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main()
04 {
05 FILE *fp;
06 char str1[]=”C programmer”,str2[]=”Java Programmer”,str3[81];
07 fp=fopen (“file.txt”,”w+”);
08 if (fp==NULL)
09 printf(“打开文件失败!”);
10 else
11 {
12 printf(“打开文件成功!”);
13 fwrite (str1,1,80,fp);
14 fwrite(str2,1,80,fp);
15 }
16 rewind(fp);
17 printf(“文件中的内容:\n”);
18 while(fread(str3,1,80,fp)!=0)
19 puts(str3);
20 fclose (fp);
21 if(remove(“file.txt”)!=0)
22 printf(“remove file error.\n”);
23 else
24 printf(“file.txt被成功删除.\n”);
25 system(“pause”);
26 }
该函数范例的运行结果如图2-26所示。
图2-26 函数范例的运行结果
2.5.5 rename函数──重命名文件
1.函数原型
int rename(const char *oldname,const char *newname);
2.函数功能
rename函数的功能是将旧文件名oldname改为新文件名newname。
3.函数参数
(1)参数oldname:旧文件名(该文件必须存在)。
(2)参数newname:新文件名(该文件不存在)。
4.函数的返回值
如果文件被重命名,则函数返回0;否则,函数返回非0值。
5.函数范例
/********************************************
*范例编号:02_29
*范例说明:重命名文件
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main ()
04 {
05 int flag;
06 FILE *fp;
07 char oldname[]=”beijing.txt”;
08 char newname[]=”shanghai.txt”;
09 char str[]=”零基础学数据结构”,strRead[81];
10 fp=fopen(oldname,”w+”);
11 if(!fp)
12 {
13 printf(“文件创建失败!”);
14 exit(-1);
15 }
16 fwrite(str,2,sizeof(str)/sizeof(str[0]),fp);
17 fclose(fp);
18 flag=rename( oldname , newname );
19 if ( flag==0 )
20 {
21 printf( “文件重命名成功!\n” );
22 printf( “读取新文件中的内容:\n” );
23 fp=fopen(newname,”r+”);
24 if(fp)
25 {
26 fread(strRead,2,80,fp);
27 puts(strRead);
28 fclose(fp);
29 }
30 }
31 system(“pause”);
32 }
该函数范例的运行结果如图2-27所示。
图2-27 函数范例的运行结果
6.注意事项
如果newname已经存在,则将被删除或被覆盖。