目录
需要了解的概念
需要理解的知识点包括:数据流、缓冲区、文件类型、文件存取方式 1.1 数据流:指程序与数据的交互是以流的形式进行的.进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流 1.2 缓冲区(Buffer):指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据.它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多.
由于不设置缓冲区的文件处理方式,必须使用较低级的I/O函数(包含在头文件io.h和fcntl.h中)来直接对磁盘存取,这种方式的存取速度慢,并且由于不是 C++ 的标准函数,跨平台操作时容易出问题.下面只介绍第一种处理方式,即设置缓冲区的文件处理方式: 事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示. 1.3 文件类型:分为文本文件和二进制文件两种.
二进制文件适用于非字符为主的数据.如果以记事本打开,只会看到一堆乱码. 1.4 文件存取方式:包括顺序存取方式和随机存取方式两种.
1.5 借助文件指针读写文件我们如果要访问文件,要借助于文本变量,即文件指针才可以完成 1.6 操作流图
文件操作主要函数2.1 文件打开与关闭2.1.1 fopen(打开文件)头文件: #include<cstdio> 函数声明: FILE * fopen(const char * path,const char * mode); 参数:
使用方式 具体含义
说明:
返回值: 文件顺利打开后,指向该流的文件指针就会被返回.若果文件打开失败则返回 NULL , 并把错误代码存在 errno 中.(附加说明 一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在 fopen() 后请作错误判断及处理.) 2.1.2 fclose(关闭文件)头文件: #include<cstdio> 函数声明: int fclose(FILE * stream); 说明: fclose() 用来关闭先前 fopen() 打开的文件.此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源. 返回值:
2.2 文件的读写
2.2.1 fgetc (由文件中读取一个字符)头文件: include<cstdio> 函数声明: int fgetc(FILE * stream); 说明:
返回值 : getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾 2.2.2 fputc(将一指定字符写入文件流中)头文件: #include<cstdio> 函数声明: int fputc(int c,FILE * stream); 说明:
2.2.3 fgets(由文件中读取一字符串)头文件: #include<cstdio> 函数声明: char * fgets(char * s,int size,FILE * stream); 说明: fgets() 用来从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上 NULL 作为字符串结束. 返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生. 2.2.4 fputs(将一指定的字符串写入文件内)头文件: #include<cstdio> 函数声明: int fputs(const char * s,FILE * stream); 说明: fputs() 用来将参数 s 所指的字符串写入到参数 stream 所指的文件内. 返回值: 若成功则返回写出的字符个数,返回 EOF 则表示有错误发生. 2.2.5 fread(从文件流读取数据)头文件: #include<cstdio> 函数声明: size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream); 说明: fread() 用来从文件流中读取数据 参数:
返回值: 返回实际读取到的nmemb数目. 2.2.6 fwrite(将数据写至文件流)头文件: #include<cstdio> 函数声明: size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream); 说明:
参数:
返回值: 返回实际写入的 nmemb 数目. 2.2.7 fprintf 与 fscanf(将指定字符写磁盘文件)函数声明:
说明: 它们与 printf 和 scanf 函数相仿,都是格式化读写函数.不同的是:fprintf 和 fscanf 函数的读写对象不是终端(标准输入输出),而是磁盘文件.printf 函数是将内容输出到终端(屏幕),因此,fprintf 就是将内容输出到磁盘文件了 2.2.8 getc(由文件中读取一个字符)头文件: #include<cstdio> 函数声明: int getc(FILE * stream); 说明:
返回值: getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾. 2.2.9 getchar(由标准输入设备内读进一字符)头文件: #include<cstdio> 函数声明: int getchar(void); 说明:
返回值: getchar()会返回读取到的字符,若返回EOF则表示有错误发生. 2.2.10 gets(由标准输入设备内读进一字符串)头文件: #include<cstdio> 函数声明: char * gets(char *s); 说明: gets() 用来从标准设备读入字符并存到参数 s 所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上 NULL 作为字符串结束,由于 gets() 无法知道字符串 s 的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题.建议使用 fgets() 取代 返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生. 2.2.11 putc(将一指定字符写入文件中)头文件: #include<cstdio> 函数声明: int putc(int c,FILE * stream); 说明:
返回值: putc() 会返回写入成功的字符,即参数 c.若返回 EOF 则代表写入失败. 2.2.12 putchar(将指定的字符写到标准输出设备)头文件: #include<cstdio> 函数声明: int putchar (int c); 说明:
返回值: putchar() 会返回输出成功的字符,即参数 c.若返回 EOF 则代表输出失败. 2.2.13 puts(由标准输入设备内读进一字符串)头文件: #include<cstdio> 函数声明: int puts(char *s); 说明: 把函数的字符串写到标准输出流 stdout,在输出流中用换行符('\n')替换字符串中的结束符null 字符('\0 ') 返回值: puts() 若成功则返回正的非零值,返回 EOF 则表示有错误发生. 2.2.14 ungetc(将指定字符写回文件流中)头文件: #include<cstdio> 函数声明: int ungetc(int c,FILE * stream); 说明: ungetc() 将参数 c 字符写回参数 stream 所指定的文件流.这个写回的字符会由下一个读取文件流的函数取得. 返回值: 成功则返回 c 字符,若有错误则返回 EOF. 2.3 文件的缓冲区操作:
2.3.1 fflush(更新缓冲区)头文件: #include<cstdio> 函数声明: int fflush(FILE* stream); 说明: fflush() 会强迫将缓冲区内的数据写回参数 stream 指定的文件中.如果参数 stream 为 NULL ,fflush() 会将所有打开的文件数据更新. 返回值: 成功返回 0 ,失败返回 EOF ,错误代码存于errno中.(错误代码: EBADF 参数 stream 指定的文件未被打开,或打开状态为只读) 2.3.2 setbuf(设置文件流的缓冲区)头文件: #include<cstdio> 函数声明: void setbuf(FILE * stream,char * buf); 说明: 在打开文件流后,读取内容之前,调用 setbuf() 可以用来设置文件流的缓冲区 参数:
2.3.3 setbuffer(设置文件流的缓冲区)头文件: #include<cstdio> 函数声明: void setbuffer(FILE * stream,char * buf,size_t size); 说明: 在打开文件流后,读取内容之前,调用 setbuffer() 可用来设置文件流的缓冲区. 参数:
2.3.4 setlinebuf(设置文件流为线性缓冲区)头文件: #include<cstdio> 函数声明: void setlinebuf(FILE * stream); 说明: setlinebuf() 用来设置文件流以换行为依据的无缓冲 IO.相当于调用 setvbuf(stream,(char * )NULL,_IOLBF,0); 2.3.5 setvbuf(设置文件流的缓冲区)头文件: #include<cstdio> 函数声明: int setvbuf(FILE * stream,char * buf,int mode,size_t size); 说明: 在打开文件流后,读取内容之前,调用 setvbuf() 可以用来设置文件流的缓冲区 参数:
2.4 文件的其他操作:
2.4.1 fseek(移动文件流的读写位置)头文件: #include<cstdio> 函数声明: int fseek(FILE * stream,long offset,int whence); 说明:
参数:
返回值: 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。 2.4.2 ftell(取得文件流的读取位置)头文件: #include<cstdio> 函数声明: long ftell(FILE * stream); 说明: ftell() 用来取得文件流目前的读写位置 返回值: 当调用成功时则返回目前的读写位置,若有错误则返回 -1,errno 会存放错误代码(错误代码: EBADF 参数 stream 无效或可移动读写位置的文件流) 2.4.3 rewind(重设文件流的读写位置为文件开头)头文件: #include<cstdio> 函数声明: void rewind(FILE * stream); 说明: rewind() 用来把文件流的读写位置移至文件开头。参数 stream 为已打开的文件指针。此函数相当于调用 fseek(stream,0,SEEK_SET)。 2.4.4 clearerr(清除错误旗标)头文件: #include<cstdio> 函数声明: void clearerr(FILE * stream); 说明: clearerr() 清除 stream 指定的文件流所使用的错误旗标。 2.4.5 fdopen(将文件描述词转为文件指针)头文件: #include<cstdio> 函数声明: FILE * fdopen(int fildes,const char * mode); 说明: fdopen()会将参数fildes 的文件描述词,转换为对应的文件指针后返回 参数: mode 字符串则代表着文件指针的流形态,此形态必须和原先文件描述词读写模式相同。关于mode 字符串格式请参考fopen()。 返回值: 转换成功时返回指向该流的文件指针。失败则返回NULL,并把错误代码存在errno中。 2.4.6 feof(检查文件流是否读到了文件尾)头文件: #include<cstdio> 函数声明: int feof(FILE * stream); 说明: feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。 返回值: 返回非零值代表已到达文件尾。 2.4.7 fileno(返回文件流所使用的文件描述词)头文件: #include<cstdio> 函数声明: int fileno(FILE * stream); 说明: fileno()用来取得参数stream指定的文件流所使用的文件描述词。 返回值: 返回文件描述词 2.4.8 freopen(打开文件)头文件: #include<cstdio> 函数声明: FILE * freopen(const char * pathconst char * mode,FILE * stream); 说明: Freopen()会将原stream所打开的文件流关闭,然后打开参数path的文件。 参数:
例子用有关文件写入函数写一个复制文件的程序 View Code
|
|