第五章  Linux 的流编程

Linux流操作基础
     流和文件的关系:流相当于一个缓冲区,可以将文件描述符和流关联,获得相应的缓冲区,以此来提高系统对磁盘的存取速度。
    流的结构和操作流程:流操作函数的操作对象不是一个文件描述符,而是一个缓冲区,这个缓冲区带有打开文件的所有信息,以及缓冲区的有关信息。
    标准流:#define STDIN_FILENO     0    //标准输入,一般是键盘
        #define STDOUT_FILENO     1    //标准输出,一般是显示器
        #define STDERR_FILENO    2    //标准错误输出,一般是显示器
    流的打开和关闭函数:
        #include <stdio.h>
        FILE *fopen(const char *path, const char *mode);
        FILE *fdopen(int fd, const char *mode);
        FILE *freopen(const char *path, const char *mode, FILE *stream);
        int fclose(FILE *fp);
    mode:    r或rb:只读,文件必须存在
        w或rw:只写,如果文件存在,则重写,如果不存在,则建立。    
        a或ab:添加打开,如果文件存在,则紧接着文件末尾输入;否则,建立新文件。
        r+,rb+,r+b:读写打开。文件必须存在,打开后,文件内容不变,文件指针指向文件头。
        w+,wb+,w+b:更新打开。若文件存在,则长度截为0,否则,创建新文件。
        a+,ab+, a+b:更新打开。若文件存在,其内容不变,若不存在,建立新文件。如果是读,则从文件开头读,如果写,则追加到文件末尾。
    流的缓冲方式和缓冲区设置:
        #include <stdio.h>
        int fileno(FILE *fp);
    流的缓冲区设置方式:
        #include <stdio.h>
        void setbuf(FILE *stream, char *buf);
        int setvbuf(FILE *stream, char *buf, int mode, size_t size);
        void setbuffer(FILE *stream, char *buf, size_t size);
        void setlinebuf(FILE *stream);
    流的读写:
        字符读写:
            #include <stdio.h>
            int fgetc(FILE *stream);//不能被实现为宏
            int getc(FILE *stream);//可被实现为宏
            int getchar(void);
            int fputc(int c, FILE *stream);//不能实现为宏
            int putc(int c, FILE *stream);//可被实现为宏
            int putchar(int c);//相当于int putc(int c, FILE stdout);
        行读写:
            #include <stdio.h>
            char *fgets(char *s, int size, FILE *stream);//设置的缓冲区大小为size,总是以NULL结尾
            char *gets(char *s);//从标准缓冲区读,不支持使用,因为没有设置缓冲区大小,容易导致缓冲区溢出
            int *fputs(const char *s, FILE *stream);//将一个以NULL结尾的字符串去掉NULL以后写入stream中,并不要求每次写一行,因为它并不要求NULL之前必须是换行符    
            int *puts(const char *s);//将NULL去掉,并加上一个换行符输出到标准输出,所以应该尽量避免使用,以免导致错误
        二进制读写(块/结构):
            size_t fread(void *buf, size_t size, size_t nmemb, FILE *stream);
            size_t fwrite(const void *buf, size_t size, size_t nmemb, FILE *stream);
            注意:块读写只能在同一系统下使用,否则可能会因为系统对结构体数据存储方式不同,以及结构体偏移量不同而产生错误。
        流的出错处理:
            #include <stdio.h>
            int feof(FILE *stream);//检查是否到达文件尾
            int ferror(FILE *stream);//检查时候出现错误
            void clearerr(FILE *stream);//清除流的错误
        流的冲洗:
            #include <stdio.h>
            int fflush(FILE *stream);
            #include <stdio.h>
            #include <stdio_ext.h>
            int _fpurge(FILE *stream);
        注意:fflush函数会在调用fclose()函数关闭流或者在一个进程被关闭之后自动调用,不需要手动去调用。
        流的定位:
            #include <stdio.h>
            int fseek(FILE *stream, long offset, int whence);//指定偏移量
            long ftell(FILE *stream);//返回当前偏移量
            void rewind(FILE *stream);//定位到文件头
            int fseeko(FILE *stream, off_t offset, int whence);//文本文件定位偏移量
            off_t ftello(FILE *stream);//返回当前偏移量
        fgetpos和fsetpos函数:
            #include <stdio.h>
            int fgetpos(FILE *stream, fpos_t *pos);
            int fsetpos(FILE *stream, fpos_t *pos);//这两个函数和fseek,ftell的主要区别是偏移量使用了抽象的pos_t结构体来存放了,这样的好处是在不同的系统上方便了一些。
    流的格式化输入和输出:
        格式化输出:
            #include <stdio.h>
            int printf(const char *format, ...);
            int fprintf(FILE *stream, const char *format, ...);
            int sprintf(char *str, const char *format, ...);    
            int snprintf(char *str, size_t size, const char *format, ...);
            #include <stdarg.h>
            #include <stdio.h>
            //以下几个和上面的4个的区别是后面的参数列表是一个指向一系列参数的指针
            int vprintf(char *format, va_list arg_ptr);
            int vfprintf(FILE *stream, const char *format, va_list arg_ptr);
            int vsprintf(char *str, const char *format, va_list arg_ptr);
            int vsnprintf(char *str, size_t size, const char *format, va_list arg_ptr);
            //返回值要么是输出的字符数,要么是一个负值
        格式化输入:
            #include <stdio.h>
            int scanf(const char *format, ...);
            int fscanf(FILE *stream, const char *format, ...);
            int sscanf(const char *str, const char *format, ...);
            #include <stdarg.h>
            int vscanf(const char *format, va_list arg_ptr);
            int vfscanf(FILE *stream, const char *format, va_list arg_ptr);
            int vsscanf(const char *str, const char *format, va_list arg_ptr);
        格式化参数:
            注意:区分:“空白符”, “空格符”, “空字符”。空白符包括空格符,制表符,水平制表符, 换行符, 走纸符,即isspace()函数返回值为真的字符;空格符是一个“ ”, 空字符是NULL,即'\0'。

转载于:https://www.cnblogs.com/StivenYang/p/8441329.html

10-12Linux流编程的一些知识点相关推荐

  1. 10款无需编程的App DIY开发工具

    10款无需编程的App DIY开发工具 你有一个很棒的创意但不会编程怎么办?外包.合伙开发还是从零学编程?这里提供另外一种方式--使用无需编程的App  DIY开发工具.DIY开发工具不仅节省了开发时 ...

  2. 笔记整理2----Java语言基础(二)06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础

    06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础 第06天 java基础语法 今日内容介绍  Eclipse断点调试  基 ...

  3. 我是如何用 10 天自学编程,改变一生的?

    我是我,一个因兴趣入行的商学院毕业的程序员.最近有不少人,来问我,想学编程,但是又不知怎么开始.所以,我想把我8年前影响我一生的10天自学编程的经历,毫无保留的分享出来. 如果看到这标题,会让你觉得, ...

  4. 偏执却管用的 10 条 Java 编程技巧

    经过一段时间的编码(咦,我已经经历了将近20年的编程生涯,快乐的日子总是过得很快),我们开始感谢那些好习惯.因为,你知道- "任何可能出错的事情,最后都会出错." 这就是人们为什么 ...

  5. 10条PHP编程习惯助你找工作

    过去的几周对我来说是一段相当复杂的经历.我们公司进行了大裁员,我是其中之一,但却体验到了其中的乐 趣.我从来没有被开除过,所以很难不去想得太多.我开始浏览招聘板块,一个全职PHP程序员的职位很吸引人, ...

  6. 10个C#编程和Visual Studio使用技巧

    10个C#编程和Visual Studio使用技巧 http://developer.51cto.com  2010-09-28 08:52  黄永兵 译  51CTO.com  我要评论(1) C# ...

  7. 10岁起编程,并不认为自己是“黑客”

    摘要:一直以来,女性在"黑客"群体中缺乏代表性,但这不是因为她们缺乏兴趣.麻省理工学院的Liz Denys从十岁开始接触编程,但由于被忽视以及性别歧视问题,她和许多女性一样,游走在 ...

  8. 10个Python编程窍门,不懂就亏了

    每次写Python,是否都会走点弯路,出点错误?这是因为有一些Python的编程窍门你还没有掌握.今天这10个Python编程窍门,可以帮你减少犯错,提高效率. 打开凤凰新闻,查看更多高清图片 1.正 ...

  9. 【Java】国外大神总结的 10 个 Java 编程技巧!

    原文:http://www.javastack.cn/article/2018/10-java-programming-skills-summary/ 这是一个国外大神20多年的经验总结出来的-- & ...

最新文章

  1. windows下eclipse连接hadoop
  2. linux 防火墙iptables简明教程
  3. gc频繁的暂停启动_减少主要GC暂停的频率
  4. mac下antlr4命令使用
  5. 懒惰是人类进步的动力,勤奋是实现偷懒的途径
  6. html嵌入python代码,python在html中插入简单的代码并加上时间戳的方法
  7. springmvc系列一 之配置介绍(包含官网doc)
  8. 关于HRESULT判断的宏(SUCCEEDED/FAILED)
  9. 振动噪声测试分析软件,DASP-V11工程版 振动噪声应变冲击
  10. 安卓手机阅读器_电子阅读器怎么选择全价位攻略(少走坑)
  11. 三种视觉自动化检测的解决方案
  12. 阿里达摩院招聘 Research Intern
  13. 618好物推荐:基于HarmonyOS和小熊派BearPi-HM Nano的护花使者
  14. 全网最简单的方法QQ透明头像设置方法(小白教程)几分钟搞定
  15. 再见,马云!再见,世界首富!
  16. android的ui模板,11免费好看的手机APP UI模板
  17. easyUI 提交按钮linkbutton失效和恢复设置
  18. Java介绍,什么是Java?
  19. 【项目管理】项目风险分析
  20. Linux下使用hiredis库与libevent实现异步接口的I/O复用

热门文章

  1. 史上最全Java集合关系图
  2. android banner 高度,Android Banner 的简单使用步骤
  3. oracle into 循环,oracle游标中使用select into查询结果为NULL导致异常提前退出循环——菜鸟解决办法(^_^)...
  4. mysql 5.7.26安装步骤_centOS7.4 安装 mysql 5.7.26的教程详解
  5. php编写一个学生类_PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
  6. 系统学习深度学习(十四)--权重初始化Xavier
  7. python怎么运行yaml配置文件_python的技巧和方法你了解多少?
  8. java dvd集合框架_JAVA 集合框架
  9. cesium版本之间如何兼容_【JS】cesium与three.js 结合的栗子,结合了一下网友们的栗子,解决了three.js 高版本模型出不来的问题...
  10. Windows核心编程_设置Windows开机自动登录