• C++回顾day03---<输入输出流>


    一:C++输入输出包含下面3个方面

    (一)标准I/O

    对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出。

    (二)文件I/O

    外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出

    (三)串I/O

    内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出

    二:I/O类库中常用流类

    (一)类名及作用

     

    (二)类关系

    ios是抽象基类,由它派生出istream类和ostream类,两个类名中第1个字母i和o分别代表输入(input)和输出(output)。
    
    istream类支持输入操作,
    ostream类支持输出操作, 
    iostream类支持输入输出操作。
    iostream类是istream类和ostream类通过多重继承而派生的类。
    C++对文件的输入输出需要用ifstrcam和ofstream类,两个类名中第1个字母i和o分别代表输入和输出,第2个字母f代表文件 (file)。
    ifstream支持对文件的输入操作,
    ofstream支持对文件的输出操作。
    类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了 类iostream。

    三:标准I/O流:cin,cout,cerr,clog

    对象

    含义

    对应设备

    对应的类

    c语言中相应的标准文件

    cin

    标准输入流

    键盘

    istream_withassign

    stdin

    cout

    标准输出流

    屏幕

    ostream_withassign

    stdout

    cerr

    标准错误流

    屏幕

    ostream_withassign

    stderr

    clog

    标准错误流

    屏幕

    ostream_withassign

    stderr

    (一)标准输入流

    1:常见函数

    cin.get()  //获取字符,指定个数字符(字符串),按照字符截取字符串
    cin.getline()  //获取一行字符串(允许空格)
    cin.ignore()
    cin.peek()
    cin.putback()

     cin.get()的使用


     1:cin.get() 读取一个字符

        char a;
        a = cin.get();
        cout << a << endl;

    或者

        char a;
        cin.get(a);
        cout << a << endl;

    2:cin.get()读取指定个数字符(字符串)

        char a[5];
        cin.get(a,5);  //虽然我们获取5个,但是当我们输入5个及以上,内部函数只会获取4个字符,最后加上'
    '
        cout << a << endl;  

    3:cin.get()获取字符串(根据指定字符截止)

        char a[10];
        cin.get(a,10,'a');  //遇到字符'a'则结束
        cout << a << endl;

    4:cin.get()更多用法可以查看源码定义和声明


     cin.getline()的使用 :同get()方法的后面两种一致


     1.方法一:获取指定个数字符

        char a[10];
        cin.getline(a,7);
        cout << a << endl;

    2.方法二:按照指定字符截取获取字符串

        char a[10];
        cin.getline(a,7,'z');
        cout << a << endl;

    注意:getline两种用法区别《重点》

    _Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
    {    // get up to _Count characters into NTCS, discard newline  
    会将一行数据到' '之前全部取出处理,会处理更多的缓冲区数据
    return (getline(_Str, _Count, _Myios::widen(' '))); } _Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count, _Elem _Delim) { // get up to _Count characters into NTCS, discard _Delim  
    只会按照指定字符截取字符串,所以不会获取所有缓冲区数据

     cin.ignore()的使用


    1.缓冲区引入《重点》 

    键盘输入和应用程序处理之间存在输入缓冲区
    应用程序和设备磁盘文件之间存在输出缓冲区

    例如图中输入字符串先是放入缓冲区中,只取走其中部分字符串。
    其余字符串依旧存在缓冲区中,若是继续获取字符,则会先将之前剩余的字符串取出(而这一部分可能是我们不需要的)
        char a[10];
        cin.getline(a,7,'z');
        cout << a << endl;
        cin.getline(a, 7, 'f');
        cout << a << endl;
        system("pause");

    注意:若是想取走缓冲区剩余字符。可以使用cin.getline()取走所有剩余数据就可以了

    2.cin.ignore()可以用于清除(忽略)缓冲区剩余内容指定个数

        char a[10];
        cin.getline(a,7,'z');
        cout << a << endl;
        cin.ignore();    //默认是忽略一个字符
        cin.getline(a, 7, 'f');
        cout << a << endl;

    cin.ignore(5); //忽略5个字符

    cin.peek()的使用:读缓冲区中下一个字符,但是不将其取走



    char a[10]; char ch; ch = cin.peek(); cout << ch << endl; cin.getline(a, 5); cout << a << endl;


     cin.putback()的使用:在缓冲区前面插入一个字符



    char a[10]; cin.get(a, 5); cout << a << endl; cin.putback('A'); cin.getline(a, 5); cout << a << endl;


     更多方法查看手册或者看源码即可


    (二)标准输出流

    1.输出流控制符

    2.用于控制输出格式的流成员函数

    3.设置格式状态的格式标志

    4.案例使用一 (double浮点型)

        double a = 123.45678910;
    
        cout << a << endl;    //默认6位有效数 123.456
        cout << setprecision(9) <<a<< endl;    //9位有效数 123.456789
        /***********浮点数******************/
        cout << setprecision(7);
        //浮点数以定点形式输出,精度变为小数点保留位数
        cout << setiosflags(ios::fixed) << a << endl;    //123.4567891
        cout << setiosflags(ios::fixed) << setprecision(8) << a << endl;    //123.45678910
        cout << setprecision(4);
        cout << setiosflags(ios::scientific) << a;    //设置浮点数以科学计数法形式显示 0x1.edd4p+6

    5.案例使用二(int整型):注意setw域宽只对后面一个输出有效

        int a = 123456;
    
        cout << a << endl;    
    
        cout << hex <<a<< endl;    //16进制显示
        cout << setiosflags(ios::uppercase) << a << endl;    //16进制字母大写
        cout << setw(10) << endl;    //设置域宽 右对齐
        cout << setfill('*') << a << endl;    //右对齐,域宽10,空白填充*
        
        cout << setw(10) << setfill('^');    //设置域宽--->注意setw域宽只对后面一个输出有效
        cout << setiosflags(ios::left) << a << endl;    //左对齐
    
        //想显示+号,需要在10进制下
        cout << dec<<setw(10)<<setfill('%');
        cout << setiosflags(ios::showpos) << a << endl;    //设置显示+号
        

    6.注意点

    1.成员函数width-->cout.width()
                  setw--->cout<<setw()
                  只对其后的第一个输出项有效
    2.格式状态分5组,每组只有一个有效(互斥)例如:dec,oct,hex设置多个只有后面那个有效
    3.可以使用'|'一次设置多个状态

    四:文件I/O 

    ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。
    ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。
    fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。

    (一)状态模式

    文件输入输出设置方式

    注意:有些属性是互斥的,使用时注意
    例如:app和trunc--->app是在文件末尾加入,而trunc是清空文件查询写入。功能互斥,用于打开文件会打开失败
    注意:打开文件时,所有打开方式,基本都是:若是文件不存在则自动创建

    文件属性

    属性  含义
    0  普通文件,打开访问
    1 只读文件
    2 隐含文件
    3 系统文件

    (二)案例使用:写入文件并读取数据

    #include <iostream>
    #include <fstream>
    
    void main()
    {
        char info[100];
        cin.getline(info, 100);
    
        //写入数据
        ofstream ofile;
        ofile.open("D:\1\io2.txt", ios::app|ios::trunc);    //以追加和创建方式打开 默认是普通文件
        if (!ofile)
        {
            cout << "ofile open failure" << endl;
        }
        else
        {
            ofile << info;    //写入普通数据
            ofile.close();    //关闭文件
        }
        
        memset(info, 0, 100);    //初始化空
        
        //读取数据
        ifstream ifile;
        ifile.open("D:\1\io2.txt", ios::in);    //读取文件 0是默认普通文件,可以像上面一样不写
        if (!ifile.is_open())
        {
            cout << "open failure" << endl;
        }
        else
        {
            ifile.getline(info, 100);
            ifile.close();
            cout << info << endl;
        }
        
        system("pause");
    }

    (三)案例使用:二进制文件操作read,write

    对二进制文件的读写主要使用istream中的write和read方法来实现
    istream& read(char* buf,int len)
    ostream& write(char* buf,int len)
    typedef struct  
    {
        char name[10];
        bool sex;
        int age;
    }Stu;
    
    void main()
    {
        //结构体操作
        Stu s,s2;
        strcpy(s.name, "fagfwa");
        s.sex = true;
        s.age = 18;
    
        //写入二进制文件
        ofstream ofile;
        ofile.open("D:\1\stu.bin", ios::binary|ios::out);
        if (!ofile.is_open())
            return ;
        ofile.write((char*)&s,sizeof(s));
        ofile.close();
        
        //读取二进制文件
        ifstream ifile;
        ifile.open("D:\1\stu.bin", ios::binary | ios::in);
        if (!ifile)
            return;
        ifile.read((char*)&s2, sizeof(s2));
        cout << s2.name << endl << s2.age << endl << s2.sex << endl;
        ifile.close();
    
        system("pause");
    }

  • 相关阅读:
    【jQuery日期处理】两个时间大小的比较
    CSS 盒子模型(Box model)中的 padding 与 margin
    如何优雅地制作精排 ePub —— 个人电子书制作规范及基本样式表
    异常处理 Exception
    Log4net
    HttpServerUtility类
    MVC 数据验证
    BigRender
    CSS中的块级元素与行级元素
    使用jQuery.form插件,实现完美的表单异步提交
  • 原文地址:https://www.cnblogs.com/ssyfj/p/10780759.html
Copyright © 2020-2023  润新知