首页 > 代码库 > 标准IO: 文件的打开与关闭函数 fopen & fclose

标准IO: 文件的打开与关闭函数 fopen & fclose

   (1) 流(stream)和文件(file)
    流和文件 在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设备之间提供了一层抽象的东西, 称之为"流
", 而将具体的实际设备叫做文件。流是一个逻辑设备, 具有相同的行为。因此, 用来进行磁盘文件写的函数也同样可以用
来进行打印机的写入。在Turbo C2.0中有两种性质的流:   文字流( text stream)和二进制(binary stream)。对磁盘来说
就是文本文件和二进制文件。本软件为了便于让读者易理解Turbo C2.0语言而没有对流和文件作特别区分。
    (2) 文件指针FILE
    实际上FILE是一个新的数据类型。它是Turbo C2.0的基本数据类型的集合, 称之为结构指针。有关结构的概念将在第>四节中详细介绍, 这里只要将FILE理解为一个包括了文件管理有关信息的数据结构, 即在打开文件时必须先定义一个文件>指针。
    (3) 以后介绍的函数调用格式将直接写出形式参数的数据类型和函数返回值的数据类型。例如: 上面打开文件的函数, 返回一个文件指针, 其中形式参数有两个, 均为字符型变量(字符串数组或字符串指针)。本软件不再对函数的调用格式作
详细说明。

fopen();
    功能:    打开文件
    头文件:   #include <stdio.h>
    函数原型: FILE *fopen(const char *path, const char *mode);
    参数说明: 第一个形式参数表示文件名, 可以包含路径和文件名两部分.如:
              "B:TEST.DAT"
              "C://TC//TEST.DAT"
              如果将路径写成"C:/TC/TEST.DAT"是不正确的, 这一点要特别注意。
              第二个形式参数表示打开文件的类型。关于文件类型的规定参见下表。

                        表  文件操作类型
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    字符                   含义
  ───────────────────────────────────────────────────
    "r"     以只读方式打开文件,该文件必须存在。
    "r+"    以读/写方式打开文件,该文件必须存在。
    "rb+"   以读/写方式打开一个二进制文件,只允许读/写数据。
    "rt+"   以读/写方式打开一个文本文件,允许读和写。
    "w"     打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件。
    "w+"    打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    "a"     以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾>,即文件原先的内容会被保留(EOF 符保留)。
    "a+"    以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文
件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)。
    "wb"    以只写方式打开或新建一个二进制文件,只允许写数据。
    "wb+"   以读/写方式打开或建立一个二进制文件,允许读和写。
    "wt+"   以读/写方式打开或建立一个文本文件,允许读写。
    "at+"   以读/写方式打开一个文本文件,允许读或在文本末追加数据。
    "ab+"   以读/写方式打开一个二进制文件,允许读或在文件末追加数据。"
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    返回值:   文件顺利打开后,指向该流的文件指针就会被返回.如果文件打开失败则返回 NULL,并把错误代码存在 errno 中

    打开方式总结:各种打开方式主要有三个方面的区别
    1、打开是否为二进制文件,用“b”标识。
    2、读写的方式,有以下几种:只读、只写、读写、追加只写、追加读写这几种方式。
    3、对文件是否必 须存在、以及存在时是清空还是追加会有不同的响应。具体判断如下图。

                       ╭ 是             ╭ 清空
    文件是否必须存在 ┤      ╭ 存在  ┤
                         ╰ 否 ┤          ╰ 追加
                                     ╰ 不存在 ─ 新建

fclose();
    功能:    关闭fopen打开的文件
    头文件:   #include <stdio.h>
    函数原型: int fclose(FILE *stream);
    返回值:   如果流成功关闭,fclose 返回 0,否则返回EOF(-1).(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF.)

    注意
    在文件操作时,需要注意以下几点问题:
    1、在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;
    2、文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。
    3、文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦;如:fp = NULL;

perror();
    功能:    用来将上一个函数发生错误的原因输出到标准设备(stderr)。
    头文件:  #include <stdio.h>
    函数原型:void perror(const char *s);

  例:

 1         #include <stdio.h>
 2         #include <stdlib.h>
 3         int main()
 4         {
 5             FILE *fp = NULL;
 6             fp = fopen("tmp","r+");
 7             if(fp == NULL)
 8             {
 9                 perror("tmp");
10                 exit(1);
11             }
12             puts("OK!");
13             fclose(fp);
14             fp = NULL;
15             return 0;
16         }
17         运行结果:
18         [root@Yelong io]# gcc fopen.c
19         [root@Yelong io]# ./a.out
20         /home/tmp: No such file or directory

 

标准IO: 文件的打开与关闭函数 fopen & fclose