C语言基础笔记整理(12)

笔记整理自哈尔滨工业大学的MOOC课程:C语言程序设计精髓 

第十二章 文件操作 

文件

   * 存储在外部介质上具有名字的一组相关数据的集合

         * 数据一般以文件的形式为用户及应用程序使用

   * 使用文件的好处

         * 程序与数据分离

         * 数据共享

         * 长期保存数据

文件是如何组织的

      C语言基础笔记整理(12)

文件的分类

     C语言基础笔记整理(12)

           流式文件

            C语言基础笔记整理(12)

       C语言基础笔记整理(12)

输入/输出重定向

    C语言基础笔记整理(12)

文件的分类

    C语言基础笔记整理(12)

文本文件和二进制文件

    C语言基础笔记整理(12)

二进制文件的特点

   C语言基础笔记整理(12)

二进制文件保存数据,不仅要按照存入时的类型,还要按存入时的格式读出,才能恢复其本来面貌

      C语言基础笔记整理(12)

C语言基础笔记整理(12)

文件与流的关系

    C语言基础笔记整理(12)

文件指针

    C语言基础笔记整理(12)

文件的打开

    C语言基础笔记整理(12)

    C语言基础笔记整理(12)

   C语言基础笔记整理(12)

   C语言基础笔记整理(12)

     w和a的区别

      C语言基础笔记整理(12)

    r+和w+的区别

      C语言基础笔记整理(12)

文件的关闭 

    C语言基础笔记整理(12)

    C语言基础笔记整理(12)

按格式读写文件

    C语言基础笔记整理(12)

    C语言基础笔记整理(12)

按字符读写文件

   C语言基础笔记整理(12)        C语言基础笔记整理(12)

   C语言基础笔记整理(12)

   其实这四个函数都是作为宏来实现的:

   C语言基础笔记整理(12)

    作为宏来实现的好处是执行速度快,省去了函数调用所需要的开销
    但是带参数的宏存在诸如没有类型检查等缺陷,所以设计者设计了fputc,fgetc这样的作为函数而不是作为宏来实现的库函数,作为函数
    的备选

    为何返回值为int,而非char?

    因为这几个函数都是通过EOF这个符号常量来说明文件末尾的,或者是说明发生了读写错误的。
    这几个函数检测到文件尾或者发现文件出现了读写错误时,函数都返回EOF。EOF在stdio.h中定义为-1
    因为并非所有的编译器都把字符型当做有符号整型来处理的,因此这几个函数在读取字符的时候如果把函数
    的返回值保存在一个字符型变量中,不是一个整型变量中,那么在判断是否到达文件末尾,或者是否发生读写
    读写错误的时候,就需要将函数的返回值与EOF进行比较。而将函数返回的字符型数据的值与EOF进行比较的
    的时候,就有可能产生错误的结果。

    为什么用符号常量EOF而不直接使用常数-1呢?

     因为标准C只是将EOF定义成了一个负的整型常量,并不一定是-1,在不同的系统中,EOF可能会取不同的值,所以
     才用符号常量而不是-1来检测文件输入数据是否结束,可以增加程序的可移植性

    C语言基础笔记整理(12)
          尽管第一个参数c被定义为整型,但是在向文件写入这个字符的时候,只写入它的第一个字节

C语言基础笔记整理(12)

C语言基础笔记整理(12)

按行写文件

   C语言基础笔记整理(12)

按行读文件

   C语言基础笔记整理(12)

   C语言基础笔记整理(12)

按数据块读写文件

   C语言基础笔记整理(12)

   C语言基础笔记整理(12)

文件的随机读写

    C语言基础笔记整理(12)

    C语言基础笔记整理(12)

    C语言基础笔记整理(12)

文件缓冲

    C语言基础笔记整理(12)

   C语言基础笔记整理(12)

   C语言基础笔记整理(12)

   C语言基础笔记整理(12)

两种方式的不同

   C语言基础笔记整理(12)