第五章  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. Request模块(八)

    Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “ ...

  2. OpenCL 使用函数 clCreateProgramWithBinary 来创建程序

    ▶ 函数 clCreateProgramWithSource 接收 OpenCL 代码(设备无关)来创建程序,而函数 clCreateProgramWithBinary 接收已经经过函数 clBuil ...

  3. maven 编译解决jdk 版本问题

    1.在父工程中pom 添加版本限制: <plugins> <plugin> <groupId>org.apache.maven.plugins</groupI ...

  4. delphi 实体类 JSON 数组

    delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas   TJson.JsonToObjectTJson.ObjectToJsonString JsonEncode O ...

  5. delphi加密算法

    function EncryptKey(sUser,sPasswd:string):string;stdcall; var __i,__k,__a : Integer; __s : string; b ...

  6. Timer控件的使用限制和注意事项

    Timer的Interval 属性当编写 Timer 组件时,需要考虑 Interval 属性的几点限制:1. 如果应用程序或另一个应用程序对系统需求很大(如长循环.大量的计算或驱动程序.网络或端口访 ...

  7. FastJson bean序列化属性顺序问题

    fastjson序列化一个java bean,默认是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序,这个特性需要1.1.42以上版本.示例如下. import co ...

  8. MySql 关键字冲突解决办法

    今天把项目发布到另一台机器上时,因为mysql版本不一致,出现了关键字冲突,virtual关键字,不清楚是不是mysql添加的新特性. select * from herb where name=&q ...

  9. 读取指定路径的Properties文件

    1.读取项目内的properties文件,项目内的properties文件一般都放在resource文件夹下面, 通过getClassLoader().getResourceAsStream()来获取 ...

  10. Linux --centos7 开机启动设置

    以Linux下指定sun用户在linux开机时执行/home/sun/startrun.sh为例: 以root登录linux 执行vi /etc/rc.d/rc.local 在文档末尾添加一行语句:s ...