linux高级编程之IO操作(西红柿种子.一)

一、Linux系统的七种文件类型
    一切皆是文件
    b    block                块设备文件                 (文件IO)
        
    c    character          字符设备文件             (文件IO)
        
    d    directory           目录文件                    (目录IO)
        
    -                              普通文件                    (标准IO、文件IO)
    
    l    link                     链接文件                    (链接IO)
        
    s    socket               套接字文件                (文件IO)
        
    p    pipe                   管道文件                   (文件IO)

二、标准IO:程序通过调用函数与内核交互,有缓存

        标准IO函数接口:头文件stdio.h 

    putchar、getchar、puts、gets、printf、scanf

    fopen/fclose、fgetc/fputc、fgets/fputs、fread/fwrite、fscanf/fprintf

文件IO:程序直接与内核进行交互 

    1.普通文件类型:
        (1)ASCII码文件
            文件中存放的数据都是能显示在终端上的字符组成
        (2)二进制文件
            文件中存放的数据不一定都是能够显示在终端的字符
        注意:ASCII码文件是一种特殊的二进制文件  
    2.流:
        (1)有方向性
        (2)具有连续性
        (3)先进先出、后进后出特性           
    3.操作文件步骤:
        (1)打开文件
        (2)写入/读出
        (3)关闭        
    4.函数接口:
        (1)fopen 
           FILE *fopen(const char *pathname, const char *mode);
           功能:
                打开文件并与其建立流
           参数:
                pathname:要打开文件名的字符串首地址
                mode:打开文件权限
                 r      只读        文件存在只读打开                                文件不存在报错                    
                 r+    读写        文件存在读写打开                                文件不存在报错                    
                 w     只写        文件存在,对文件清0,只写打开             文件不存在,创建文件,只写打开
                 w+   写读        文件存在,对文件清0,写读打开             文件不存在,创建文件,写读打开   
                 a    追加只写   文件存在,追加只写打开                       文件不存在,创建文件,只写打开 
                 a+    追加读写 文件存在,追加读写打开                       文件不存在,创建文件,读写打开 
           返回值:
                成功返回打开获得的文件流指针
                失败返回NULL
        perror("fopen failed!");  
        不支持像printf一样用格式化控制字符输出,但优点是可以打印出错信息到stderr(标准出错流)

        适用于Linux,比如系统函数read,write,socket等;

        (2)fclose 
           int fclose(FILE *stream);
           功能:
                关闭流
           参数:
                stream:文件流指针
           返回值:
                成功返回0 
                失败返回EOF(-1)    EOF表示END OF FILE
        注意:如果不手动关闭,程序结束会帮你自动关闭,但是一般用完文件后需要自己关闭,否则会造成内存泄漏(之前的fopen时系统自动为fp开辟了空间);

5.三个特殊流:
        程序运行时,操作系统会默认打开三个流:
            stdin            标准输入流            gets getchar scanf 
            stdout        标准输出流            puts putchar printf
            stderr        标准出错流            perror
        注意:fclose();函数可以关闭这三个流

6.缓存:
        1.缓存类型:
                (1)全缓存                4k == 4096
                    (1)程序结束刷新
                    (2)缓存区满刷新
                    (3)fflush函数刷新           
     与文件建立的缓存一般为全缓存,所以每次后续进行读写操作时会首先char tmpbuff[4096];         
                (2)行缓存                1k == 1024 
                    (1)程序结束刷新
                    (2)缓存区满刷新
                    (3)fflush函数刷新 
                    (4)遇到\n刷新                     
                    与终端建立的缓存一般为行缓存,如stdout stdin                     
                (3)不缓存                0k 
                    立即刷新                    
                    人机交互、界面控制、出错处理一般使用不缓存,如stderr

        2.改变缓存类型
                setvbuf 
                int setvbuf(FILE *stream, char *buf, int mode, size_t size);
                功能:
                    修改文件流指针的缓存类型
                参数:
                    stream:文件流指针
                    buf:指定缓存空间首地址
                    mode:
                         _IONBF(IO NOT BUF)        不缓存
                         _IOLBF                行缓存
                         _IOFBF                全缓存
                    size:
                        指定缓存区大小
                返回值:
                    成功返回0 
                    失败返回非0 

7.流的读写函数

        1.fputc和fgetc
              应用场景:
                操作ASCII码文件、操作单个字符            
              (1)fputc
                 int fputc(int c, FILE *stream);
                 功能:
                    向流中写入一个字符
                 参数:
                    c:写入文件中字符的ASCII码值
                    stream:文件流指针 
                 返回值:
                    成功返回写入字符的ASCII码值
                    失败返回EOF(-1)                
                注意:
                    1.fputc写入文件中的是字符
                    2.fputc写入一个字符

              (2)fgetc
                 int fgetc(FILE *stream);
                 功能:
                    从流中读取字符
                 参数:
                    stream:文件流指针 
                 返回值:
                    成功返回读取字符的ASCII码值
                    失败返回EOF(EOF是针对于读的,一般会读到文件末尾,结束)
                    读到文件末尾返回EOF                    
            2.fputs/fgets 
              应用场景:
                只能操作ASCII文件、操作字符串                
                (1)fputs 
                   int fputs(const char *s, FILE *stream);
                   功能:
                        向流中写入字符串(不会写入s中的\0)
                   参数:
                        s:写入字符串的首地址
                        stream:文件流指针 
                   返回值:
                        成功返回非负整数
                        失败返回EOF

                (2)fgets
                        char *fgets(char *s, int size, FILE *stream);
                        功能:
                            从流中读size个字符,遇到EOF或者\n读取停止
                        参数:
                            s:存放读取到字符串空间首地址 
                            size:想要读取字符的个数
                            stream:文件流指针
                        返回值:
                            成功返回读取到字符串存放空间的首地址
                            失败返回NULL
                            读到文件末尾返回NULL            
                        gets(tmpbuff);
                        fgets(tmpbuff, sizeof(tmpbuff), stdin);
                        注意:
                            gets会去掉从终端接收的\n字符
                            fgets不会去掉从终端接收的\n字符

8.主函数传参:
        int main(void);
        void main(void);
        int main(int argc, const char *argv[]);
        int main(int argc, const char **argv);
        argc是执行程序时,传入参数的个数;
        argv是一个指针,分别指向传入字符串的首地址;

本期的分享就到此结束啦!不懂的或者需要源码的同学们可以滴滴我交流哦!(qq:1462161851)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值