C/C++函数与算法速查宝典
上QQ阅读APP看书,第一时间看更新

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已经存在,则将被删除或被覆盖。