第五章  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'。

10-12Linux流编程的一些知识点的更多相关文章

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

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

  2. Spark结构式流编程指南

    Spark结构式流编程指南 概览 Structured Streaming 是一个可拓展,容错的,基于Spark SQL执行引擎的流处理引擎.使用小量的静态数据模拟流处理.伴随流数据的到来,Spark ...

  3. 五分钟学习Java8的流编程

    1.概述 Java8中在Collection中增加了一个stream()方法,该方法返回一个Stream类型.我们就是用该Stream来进行流编程的: 流与集合不同,流是只有在按需计算的,而集合是已经 ...

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

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

  5. 10条PHP编程习惯

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

  6. 记录这段时间java编程的小知识点

    记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift  table 同时按,是整体左 ...

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

    本文由 ImportNew - LynnShaw 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 经过一段时间的编码(咦,我已经经历了将近20年的编程生涯,快乐的日子总是过得 ...

  8. Java中10个流对象重点掌握

    目前为止,10个流对象重点掌握: 字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileO ...

  9. 第10章 Shell编程(2)_字符截取命令

    2. 字符截取命令 2.1 cut字段提取命令(grep提取行,cut提取列) (1)cut命令:#cut [选项] 文件名 选项: -f 列号:提取第几列: -d 分隔符:按照指定分隔符分割列,默认 ...

随机推荐

  1. phpcms模块开发中的小问题及解决方法

    1.模块菜单中文名出错 在编写安装模块时候可能需要更改extention.inc.php中定义中文名称,由于反复安装或者通过phpcms的扩展->菜单管理 修改菜单名会导致中文名失败.解决办法很 ...

  2. python beautifulsoup爬虫

    爬虫这个听起来很 hack 的名字,是我学习 python 的诱因.当 python 基础学习到一定程度(基本语法,数据类型掌握) 就可以开启自己的小爬虫了.毕竟实践才是提高的最快途径.废话说完了,下 ...

  3. python3.6编程第一课画个五角星

    使用的是海龟图库  turtle import turtle turtle.forward(100) turtle.right(144) turtle.forward(100) turtle.righ ...

  4. MYSQL, REDIS 等数据库的介绍

    MySQL: 数据库概述 MySql安装和基本管理 MySQl创建用户和授权 初始mysql语句 库的操作 表的操作 数据类型 数据类型(2) 完整性约束 外键的变种 三种关系 数据的增删改 单表查询 ...

  5. 「小程序JAVA实战」小程序的个人信息作品,收藏,关注(66)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudegerenxinxizuopinshoucangguanzhu65 ...

  6. JAVA 操作Excel工具类

    Bean转Excel对象 /* * 文件名:BeanToExcel.java */ import java.util.ArrayList; import java.util.List; import ...

  7. 迷你MVVM框架 avalonjs 1.3.4发布

    发现一个以前从来没发现的大BUG,紧急发布此版本. fix getEachProxy BUG,此BUG会导致监控数组在删除某元素然后再添加元素时出现问题. avalon ms-on-*绑定添加一个钩子 ...

  8. js中获取页面元素节点的几种方式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. Filebeat+Logstash+Elasticsearch测试

    安装配置好三个软件使之能够正常启动,下面开始测试. 第一步 elasticsearch提供了restful api,这些api会非常便利,为了方便查看,可以使用postman调用接口. 1.查看Ela ...

  10. 链表求和12 · Add Two Numbers

    反向存储,从左往右加 [抄题]: 你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式返回和.给 ...