文件IO其一 标准IO

1.文件的概念

  文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现。

                

  系统调用、文件IO、标准IO的关系如下:

              

2.linux系统的文件分类

  (1).普通文件(-):ELF文件,文本文件

  (2).目录(d)

  (3).字符设备文件(c):访问字符设备

  (4).块设备文件(b):访问块设备

  (5).连接文件(l):相当于快捷方式

  (6).管道文件(p):用于管道通信

  (7).套接字文件(s):用于socket通信

3.文件缓冲区

  文件缓冲区是在访问文件时不会每次操作都要去同步到访问磁盘中的文件,而是到达某种条件后才合并访问,根据同步的条件不同,文件的缓冲方式有三种:

  a.全缓冲

    当缓冲区满了才同步(刷新缓冲区)

  b.行缓冲

    当遇到换行符" "才同步缓冲区

  c.无缓冲

    没有缓冲区

  标准输入、标准输出属于行缓冲,标准错误属于无缓冲,缓冲区大小在512bytes~4Kbytes之间的效率最高。

  PS:printf函数会同步到缓冲区的情形(输出)

    a.遇到换行符" "

    b.程序正常结束

    c.遇到scanf函数

    d.缓冲区满了

    e.调用了fflush函数

  修改缓冲区的大小

    setbuf()/setvbuf()

    等价于

    

     

     参数:stream  要修改缓冲区的文件

       buf  缓冲区手地址

       mode  缓冲区类型

       

       

        

       size  缓冲区的大小

       成功返回0,失败返回非0。

 4.标准IO

  标准IO属于C标准库中的关于文件操作的可函数,只要有C的环境就可以使用,文件的操作都是按照以下步骤进行:打开文件  >  操作文件  >  关闭文件。

  a.打开文件  fopen函数 

     参数:  pathname  要打开的文件路径,要用双引号括起来

         mode  打开的方式

r 以只读方式方式打开,文件必须存在
r+ 以读写方式方式打开,文件必须存在
w 以只写方式方式打开,文件不存在则创建,存在则清空文件内容
w+ 以读写方式方式打开,文件不存在则创建,存在则清空文件内容
a 以只写方式方式打开,文件不存在则创建,文件存在则在末尾追加(读写位置在文件末尾)
a+ 以读写方式方式打开,文件不存在则创建,文件存在则在末尾追加(读写位置在文件末尾)


                   fopen默认以文本方式打开,如果希望以二进制打开可以加"b"("rb+" "r+b")

      成功返回文件流指针(代表一个打开的文件),失败返回NULL。

  b.关闭文件  fclose函数

    

    传入fopen的返回值

       注:不再访问的文件应该关闭,在程序结束时候所有打开的文件都会被自动关闭,但是要手动关闭。

c.文件读写

    1)非格式化读写

      I:按字符读写  fputc/fgetc

      

      参数:c - 要写的字符(字符数据)

               stream - 要写的文件流指针

         成功返回写入的字符,失败返回EOF

      

      参数就是要读的文件流指针

         成功返回读到的字符,失败或者读到末尾就返回EOF

       II:按行读写  fputs/fgets

      

       参数:  s - 要写入的字符串(不包括)

              stream - 要写的文件流指针

            成功返回非0数据,失败返回EOF

       

       读到换行符/文件结束/size-1大小 为止,在最后加上结束符

         参数:  s - 读文件内容存储首地址

               size - s指向空间的大小

              stream - 要读的文件流指针

            成功返回读到的内容,失败/读到末尾返回NULL

      注:从键盘读取字符串不要用scanf,而要用fgets(buf,size,stdin);

      gets函数从标准输入读取字符串,但是不检查越界,不允许使用,puts函数输出字符串到标准输出,也不常用

      III:按块读写  fwrrite/fread

      

       参数: ptr - 读/写的内存地址

               size - 读/写单个数据大小

               nmemb - 希望读/写数据个数

               stream - 读/写的文件流指针

          返回成功读/写的数据个数(成功个数小于希望的个数,出错/到末尾)

      如何区分读到末尾和出错 ------------- 使用ferror函数和feof函数

       

       如果出错,ferror函数返回真

         如果读到末尾,feof函数返回真

       if(ferror(fp)){

       //出错

       }

      if(feof(fp)){

        //读到文件末尾

      }

5.格式化读写  fprintf/fscanf

        printf/sacnf  从标准输入输出设备格式化输入/输出

        sprintf/sscanf  从字符串格式化输入输出

        fprintf/fscanf  从文件中格式化输入输出

        int fprintf(FILE *stream,const *format,.......);

        int fscanf(FILE *stream,const *format,......);

       这两个函数和printf/scanf相似,只是多了个参数代表文件。

6.非读写操作

      标准IO的费读写操作主要是关于文件读写位置相关的函数,在C语言中使用一个非负整数记录文件读写位置,这个非负整数的值就是读写位置离文件开头的距离(字节)。

      标准IO提供的几个文件读写位置相关的函数如下:

       fseek()/rewind()/ftell()

      

       fseek用于手动调整文件读写位置,参数:

         stream  代表要操作的文件

         offset  相对于基准的便宜(整数向后偏移,负数向前偏移,单位是字节)

         whence  读写位置的基准

         SEEK_SET  文件开头

         SEEK_CUR  当前位置

         SEEK_END  文件末尾

       成功返回0,失败返回-1。ftell函数用于获取当前读写位置离文件开头的距离(字节),rewind函数用于将读写位置移动到文件开头。可以用用ftell和rewind函数来求文件的大小,将读写位置移动到文件的末尾,再求当前位置距离文件开头的距离。

 PS:如果有错误麻烦指出来,大家互相学习 0-0

原文地址:https://www.cnblogs.com/smallqizhang/p/12370143.html