zoukankan      html  css  js  c++  java
  • 标准 I/O (带缓冲)

    标准IO中分文本流和二进制流

      windows系统中:(1) 二进制流 - 换行符 ' '    (2) 文本流 - 换行符 ‘ ' ' '

      linux 系统中:不区分文本流和二进制流:换行符 - ' '

    一 。标准I/O 提供3种类型的缓冲(流的缓冲)

      1. 行缓冲(大小1024字节);刷新行缓存的方法 (1)程序正常结束,(2)行缓冲区满,(3)遇到 ' '  ,(4)使用fflush函数

      2. 全缓冲(大小4096字节);刷新全缓存的方法 (1)程序正常结束,(2)行缓冲区满,(3)使用fflush函数; 

      3. 不带缓存;标准IO库不对字符进行缓冲,例如标准出错stderr

    二 。系统分配的3个流: 

    标准输入 stdin; 标准输出  stdout   ; 标准错误  stderr ;(标准I/O预定义3个流,当进程创建或者开启的时候,系统就会先分配三个流指针)

    三 。文本流: 

    通过 FILE 创建一个流指针实现对文本流的操作

    打开一个文本的mode参数选择

     

     头文件 <stdio.h>

    1. 流的打开:FILE * fopen(const *char path, const char *mode)  ; 参数,文件的路径和打开的模式(只读,只写等) , 返回这个文本的指针,可对这个文本流进行读写操作等。

    2. 流的关闭:int fclose( FILE *stream ); 参数要关闭的文本流,失败返回EOF(-1) ,成功返回 0 

    3. 向流中写入一个字符 : int fputc(int c, FILE *stream);   参数要输出的字符,和输出到那个流中(可以是标准流,文本流), 失败返回EOF, 成功返回 写入的字符

    4. 从流中读取一个字符: int fgetc(FILE *stream);  参数 在那个流中读取字符,返回读取的字符(ascii对应

    6. 从流中读取多个字符: char *fgets(char *s, int size, FILE *stream);  参数 s 存放读取的数据, size 读取多少个字符,stream 从哪个流读取的流指针;成功返回 s,失败返回NULL

    7. 向流中写入多个字符:int fputs(const char *s, FILE *stream); 参数,把 s 中的数据写入到stream指向的流中,成功返回1 失败返回-1

    8. 刷新缓存: int fflush(FILE *stream);   参数,要刷新的流 成功返回0,失败返回EOF

    例子1:从终端输入获取字符,然后写到文本中

    #include <stdio.h>
    
    int main(int argc, const char *argv[])
    {
        char buf[1024] = {0}; //定义缓冲区,从终端获取数据,往文本流中写入
    #if 0
        //向终端输出
        puts("HHHHHHHH");
        fputs("HAHGAGAGAGAGA
    ",stdout); //输出到标准输出流中,(输出到终端上)
    #endif
        
        //终端获取数据放到 buf 中,一会把 buf 中的内容写到文本流中
        char ch=0;
        int i=0;
        while((ch=getchar())!='q' && i<1024) //终端输入遇到 q 或者 到达最大缓存,结束输入
        {
            buf[i++] = ch;
        }
    
    #if 1
        //向文本中输出
        FILE *fp = NULL; 
        if((fp = fopen(argv[1],"w")) == NULL) //参数 "w" 表示写入,每次打开文件先清空文件,再写入数据
        {
            perror("open fail:");//标准错误输出
            return -1;
        }
        //把 buf 中的数据写入到 fp 指向文本流中
        fputs(buf,fp);//把数据写入文本流中, fgets 不带换行符输入到文本流中
        fclose(fp); //关闭文本流
    #endif
        return 0;
    }

    测试结果:

    例子2,从文本流中读取数据

    #include <stdio.h>
    
    int main(int argc, const char *argv[])
    {
        char buf[1024] = {0};//定义 存放读取的数据 
    
        FILE *fp = NULL;
        if((fp=fopen(argv[1],"r")) ==NULL)
        {
            perror("open fail:");
        }
        
        // fgets 只读取一行的指定个数的内容//循环把文本流中的数据读完
        while((fgets(buf,5,fp)) != NULL)//读取全部数据
        {
            printf("%s",buf); //打印读取到的数据
        }
        fclose(fp);
        return 0;
    }

    四 。 出错处理

    1.  头文件<stdio.h>    void perror(const char *s);    参数输出到终端的提示语,后面会跟着打开错误错误类型提示

    2.  头文件<string.h>   char *strerror(int errnum);    参数  errnum 错误号,错误原因的信息

  • 相关阅读:
    noip模拟赛 梦想
    noip模拟赛 水题
    noip模拟赛 猜数字
    Java基础知识强化64:基本类型包装类的引入
    Java基础知识强化63:Arrays工具类之方法源码解析
    Java基础知识强化62:Arrays工具类之概述和使用
    Java基础知识强化61:经典查找之 常见查找算法小结
    Java基础知识强化60:经典查找之二分查找
    Java基础知识强化59:String(字符串)和其他类型的相互转化
    Java基础知识强化58:经典排序之二叉树排序(BinaryTreeSort)
  • 原文地址:https://www.cnblogs.com/electronic/p/10907403.html
Copyright © 2011-2022 走看看