c语言标准库详解(一):stdio.h之文件操作

c语言标准库详解(一):之文件操作

总述

头文件中定义的输入和输出函数、类型以及宏的数目几乎占整个标准库的三分之一。
流(stream)是与磁盘或其它外围设备关联的数据的源或目的地。尽管在某些系统中(如在著名的 UNIX 系统中),文本流和二进制流是相同的,但标准库仍然提供了这两种类型的流。文本流是由文本行组成的序列,每一行包含 0 个或多个字符,并以’\n’ 结尾。在某些环境中, 可能需要将文本流转换为其它表示形式(例如把’\n’映射成回车符和换行符),或从其它表示形式转换为文本流。二进制流是由未经处理的字节构成的序列,这些字节记录着内部数据, 并具有下列性质:如果在同一系统中写入二进制流,然后再读取该二进制流,则读出和写入的内容完全相同。

注:
在一些语言中,二进制流与文本流的区别还是比较大的,比如Java语言。如果文件是由程序而非人来读取,推荐二进制流。

打开一个流,将把该流与一个文件或设备连接起来,关闭流将断开这种连接,打开一个 文件将返回一个指向 FILE 类型对象的指针,该指针记录了控制该流的所有必要信息,在不引 起歧义的情况下,我们在下文中将不再区分“文件指针”和“流” 。
程序开始执行时,stdin、stdout 和 stderr 这 3 个流已经处于打开状态。

fopen()函数

下列函数用于处理与文件有关的操作。其中,类型size_t是由运算符sizeof生成的无符号整型。

FILE *fopen(const char *filename,const char *mode)

fopen函数打开filename指定的文件,并返回一个与之相关的流。如果打开操作失败,则返回NULL。
访问模式mode可以为下列合法值之一:

mode 作用
“r” 打开文本文件用于读
“w” 创建文本文件用于写,并删除已存在的内容(如果有的话)
“a” 追加;打开或创建文本文件,并向末尾追加内容
“r+” 打开文本文件用于更新(即读和写)
“w+” 创建文本文件用于更新,并删除已存在的内容(如果有的话)
“a+” 追加;打开或创建文本文件用于更新,写文件时追加到文件末尾

后 3 种方式(更新方式)允许对同一文件进行读和写。在读和写的交叉过程中,必须调用 fflush 函数或文件定位函数。如果在上述访问模式之后再加上 b,如“rb”或“w+b”等,则表示对二进制文件进行操作。文件名 filename 限定最多为 FILENAME_MAX 个字符。一次最多可打开 FOPEN_MAX 个文件。

freopen()函数

FILE *freopen(const char *filename,const char *mode,FILE *stream)

freopen 函数以 mode 指定的模式打开 filename 指定的文件,并将该文件关联到stream指定的流。它返回 stream;若出错则返回 NULL。Freopen 函数一般用于改变与stdin、stdout 和 stderr 相关联的文件。

fflush()函数

int fflush(FILE *stream)

对输出流来说,fflush函数将已写到缓冲区但尚未写入文件的所有数据写到文件中。对输入流来说,其结果是未定义的。如果在写的过程中发生错误,则返回 EOF,否则返回 0。fflush(NULL)将清洗所有的输出流。

fclose()函数

int fclose(FILE *stream)

fclose 函数将所有未写入的数据写入stream 中,丢弃缓冲区中的所有未读输入数据,并释放自动分配的全部缓冲区,最后关闭流。若出错则返回 EOF,否则返回 0。

remove()函数

int remove(const char *filename)

remove 函数删除 filename指定的文件,这样,后续试图打开该文件的操作将失败。 如果删除操作失败,则返回一个非 0 值。

rename()函数

int rename(const char *oldname,const char *newname)

rename函数修改文件的名字。如果操作失败,则返回一个非0值。

tmpfile()函数

FILE *tmpfile(void)

tmpfile函数以模式"wb+"创建一个临时文件,该文件在被关闭或程序正常结束时将被 自动删除。如果创建操作成功,该函数返回一个流;如果创建文件失败,则返回 NULL。

tmpnam()函数

char *tmpnam(char s[L_tmpnam])

tmpnam(NULL)函数创建一个与现有文件名不同的字符串,并返回一个指向一内部静态数组的指针。tmpnam(S)函数把创建的字符串保存到数组 s 中,并将它作为函数值返回。s 中至少要有 L_tmpnam 个字符的空间。Tmpnam 函数在每次被调用时均生成不同的名字。在程序执行的过程中,最多只能确保生成 TMP_MAX 个不同的名字。注意,tmpnam 函数只是用 于创建一个名字,而不是创建一个文件。

setvbuf()函数

int setvbuf(FILE *stream,char *buf,int mode,size_t size)

setvbuf 函数控制流 stream 的缓冲。在执行读、写以及其它任何操作之前必须调用 函数。当 mode 的值为_IOFBF 时,将进行完全缓冲。当 mode 的值为_IOLBF 时,将对文本文件进行行缓冲,当mode 的值为_IONBF 时,表示不设置缓冲。如果 buf 的值不是 NULL,则 setvbuf 函数将 buf 指向的区域作为流的缓冲区,否则将分配一个缓冲区。size 决定缓 冲区的长度。如果 setvbuf 函数出错,则返回个一非 0值。

setbuf()函数

void setbuf(FILE *stream,char *buf)

如果 buf 的值为 NULL,则关闭流 stream 的缓冲;否则 setbuf 函数等价于 (void)setvbuf(stream, buf, _IOFBF, BUFSIZ)。

你可能感兴趣的:(c语言)