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个字符,最后加上'\n'
    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  
会将一行数据到'\n'之前全部取出处理,会处理更多的缓冲区数据
return (getline(_Str, _Count, _Myios::widen('\n'))); } _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");
}

 

posted @ 2019-04-28 11:13  山上有风景  阅读(332)  评论(0编辑  收藏  举报