zoukankan      html  css  js  c++  java
  • 1012Linux流编程的一些知识点

    第五章  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'。
           
    起风了,努力生存
  • 相关阅读:
    asp.net mvc让我告诉你请求从哪里来
    我也要学iOS逆向工程--函数
    我也要学iOS逆向工程--全局变量
    我也要学C语言-第十九章:命令行参数
    使用docker搭建nfs实现容器间共享文件
    Golang控制goroutine的启动与关闭
    我是如何用Go语言搭建自己的博客的
    让我们一起Go(十三)
    让我们一起Go(十二)
    让我们一起Go(十一)
  • 原文地址:https://www.cnblogs.com/StivenYang/p/8441329.html
Copyright © 2011-2022 走看看