网站需要前台后台免费域名 主机
1.基本概念
 文件:
     一组相关数据的集合 
 文件名:
     01.sh //文件名 
2.linux下的文件类型 
   b block         块设备文件   eg: 硬盘 
   c character     字符设备文件 eg: 鼠标,键盘
   d directory     目录文件     eg: 文件夹 
   - regular       常规文件     eg: 1.txt 01.sh xx.bmp 
   l symblink      软链接       eg: 快捷方式
   s socket        套接字       eg: 网络通信用
   p pipe          管道         eg: 进程间通信 
  
3.思想 
   linux中一个核心思想 
   everything is file!
  
4.文件的基本操作
【1】用户方面
  打开(新建)
  输入(写数据)
  阅读(读取)
  删除 
  插入
  修改 
  关闭 (保存)
  
  【2】研发方面
  1.打开 
  2.写 
  3.读 
  4.关闭 
 5. linux操作文件的函数 
    两套函数 (两套操作路径)
    
    (1) 系统调用 --- 内核提供的函数      
    (2) 库函数   --- 第三方提供的函数 
        
     (1).库函数 
     c library  // c库函数 
    集成了很多功能函数 
     //标准输入输出 
     //数学函数 
     //... 
      -lm 
     #include <math.h>
     
     
     标准输入输出 --- stdio 文件操作 
     
     
     标准io; stdio.h
 1.标准io的概念 
     1975 Dennis r IO库,
     从C语言的标准,ANSI c 
     IO  input  output
     I: 键盘是标准输入设备 ====》默认输入就是指键盘  /dev/input
     O: 显示器是标准输出设备 ==》默认输出就是指显示器
     
     Linux操作系统当中IO都是对文件的操作
     C一部分,任何支持标准C的系统都可使用标准IO实现文件存储
     标准IO在UNIX上是对文件IO的封装
    
     一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,
     加入缓冲区,可以有效减少系统调用的次数,节省系统IO调度资源
     
     说明:
     标准IO库,不单单是linux上有,在windows,Mac os上都有。
     很多操作系统都实现了标准IO库。
     都是依据IOS C标准实现的。
     所以基本保证了可移植性。
     但是因为标准和具体实现之间的差异,
     未必敢保证所有的函数在都可以相互通用。
     
     标准IO都干了些啥?
     标准IO处理了很多细节:
     (1).处理缓冲区分配   (缓存--提高效率 --- 慢速 快速)
     (2).读写IO的块长度的优化
     (3).对系统调用进行了封装,内部对应的"文件描述符" 
     
     好处:
         用户使用方便,不必再担心如何选择正确的块长度。
     //地位:
         标准I/O库是由 Dennis Ritchie在1975年左右编写的。
         它是Mike Lesk编写的可移植I/O库的主要修改版本。
         令人惊讶的是,50年来,几乎没有对标准I/O库进行修改。
 
6. 函数接口 
   
        
  1.打开 -- fopen  //file open  
  2.写/读 
    //按字符读写 
    fgetc/fputc 
    //按行读写 
    fgets/fputs 
    //按对象读写
    fread/fwrite   
  3.关闭 
    fclose --- file close
  fopen 
    
   man手册的内容 
       Name 名字+简短说明 
       SYNOPSIS 头文件 + 函数原型 
       DESCRIPTION 函数的一些实用细节说明   
       RETURN VALUE 返回值
   FILE * fopen(const char *pathname,const char *mode);
   功能:
          流打开函数
   参数:
      @pathname --- 要打开的文件名 //字符串形式的名字 
      @mode     --- 打开的模式 
        r   --- 只读  
        r+  --- 读写 
                说明: 带r的 要求,文件必须存在 ,如果不存在,就会报错
        w   --- 只写 
        w+  --- 读写 
                说明:  
                    文件存在 ,截断成 0长度 
                    不存在,则创建
        a  --- 追加(写)
        a+ --- 读写 
               说明:
                  读 从头读 
                  写 从末尾开始写 
                  文件存在 则打开做写操作即可 
                  文件不存在 创建文件 
   返回值:
      成功 FILE*指针  //文件指针 流指针 --- 从程序上讲,FILE *指针就代表打开的这个文件
      失败 NULL 同时 errno会被设置 
      
   void perror(const char *s);
   功能:
       打印错误信息 
   参数:
     s  //用户自定义字符串



  
7.fgetc
  int fgetc(FILE * stream);
  功能:
      从文件中读取字符 
  参数:
      @stream 表示要读取的文件对应的流指针 
  返回值:
      成功 对应字符的ASCII码值 
      失败 EOF 到达文件结尾 
           出错 
           
 问题:
    EOF  
    文件中有没有 EOF?  //只是到达结尾时的一个标志
8.fputc
 int fputc(int c,FILE *stream);
   功能:
       将一个字符输出到指定的流(文件)
   参数:
     @c          //要输出的字符 ---ascii码值
     @stream     //指定的文件 
   返回值:  
     成功 被写入的字符的ASCII码值
     失败 EOF 
     
 系统默认打开的流指针:
 stdin  //标准输入 
 stdout //标准输出 
 stderr //标准出错 --- 屏幕  --- 可以专门把错误信息输出到 stderr 

9.fclose
  int fclose(FILE *stream);
   功能:
      关闭文件 
       刷新流
       关闭了底层文件描述符
  返回值:
    成功 0
    失败 EOF
    注意,不要多次重复关闭

练习:
      cp src.txt dest.txt 
      
      //1.打开文件 
      src.txt //读
      dest.txt //写 
      //2.读写
      从 src中读数据 
      写到 dest中
      //3.关闭 
      fclose 

    10.fgets
char * fgets(char*s,int size,FILE*stream)
 功能:
    从stream中读取size-1个字符,到s指向的空间 
 参数:
   @s        //存放读取到的数据 对应的内存空间 
   @size     //指定一次最多读取多少个字符 
   @stream   //表示要读取的文件 
 返回值:
    成功 返回s
    失败 NULL 
         读到文件结尾 也 返回NULL 
        
 注意:
    fgets读取结束:
    1. EOF
    2. '\n'
    3. size-1
11.fputs
    
    int fputs(const char *s, FILE *stream);
    功能:
       输出s到stream中
    参数:
     @s 代表要输出的字符串 
     @stream 代表 输出到的文件 
    返回值:
     成功 非负数 
     失败 EOF
     
   注意:
      不会将 '\0' 输出 
        
 练习:
       cat //fgets实现cat 
       
     
练习:
      统计文件行数 
 
练习:
    从键盘输入数据,
    把数据保存到一个文件中

 练习:
    cp    
3
12.fputs(buf,);
  
  
  "123" --- 文本文件 --- '1''2''3'  //每个数据是按照固定的编码格式存放的 -ASCII
  123   --- 二进制   --- 01111011   //
  
  linux下操作时 ,没有区别 
  windows下区别 
  
  说明:
     1.fgets 和 fputs 在拷贝 二进制文件时 可能出问题 
 
  
