C++ 笔记1 输入输出相关的类及流操纵算子

学C++有一年多的时间了,当时有些东西理解不够的深入,也忘记了好多细节的部分,于是出了C++笔记这个专辑吧,哈哈哈!

目录

输入输出

与输入输出有关的类

istream是用于输入的流类,cin(读作see-in)就是该类的对象 ostream是用于输出的流类,cout(读作see-out)就是该类的对象 ifstream是用于从文件读取数据的类 ofstream是用于向文件写入数据的类 iostream是既能用于输入,又能用于输出的类

标准流对象

输入流对象:cin与标准输入设备相连 输出流对象:cout与标准输出设备相连 cerr与标准错误输出设备相连 clog与标准错误输出设备相连 缺省情况下: cerr«”Hello, world”«endl; clog«”Hello, world”«endl; cout«”Hello, world”«endl;

三者一样

1.cin对应与标准输入流,用于从键盘读取数据,也可以被重定向为从文件中读取数据。

2.cout对应于标准输出流,用于向屏幕输出数据,也可以被重定向为向文件中写入数据。

3.cerr对应于标准错误输出流,用于向屏幕输出出错误信息。

4.clog对应于标准错误输出流,用于向屏幕输出出错误信息。

Notice: cerr和clog的区别在于cerr不使用缓冲区,直接向屏幕输出信息;而clog中的信息会先被存放在缓冲区,缓冲区满或者刷新时才输出到屏幕。

判断输入流结束

可以用如下方法判断输入流结束

int x;
while(cin>>x){
	
}

如果是从文件输入,则读到文件尾部,输入流就算结束 如果是从键盘输入,Windows系统中,在单独的一行输入Ctrl+Z代表输入流结束;在Unix(包括Mac OS X) 系统中,在单独的一行输入Ctrl+D代表输入流结束。

输出重定向

#include<iostream>
using namespace std;
int main()
{
    double x, y;
    freopen("text.txt","w",stdout); //将标准输出重定向到text.txt文件
    if(y == 0) //除数为0则在屏幕上输出错误信息
        cerr<<"error."<<endl;
    else
        cout<<x/y<<endl; //输出结果到text.txt
    return 0;
}

运行结果:

Question:怎样将stdout重定向到屏幕?

Answer:C标准库的回复是:不支持。没有任何方法可以恢复原来的输出流。 那是否存在依赖具体平台的实现呢?存在。在操作系统中,命令行控制台(即键盘或者显示器)被视为一个文件,既然是文件,那么就有“文件名”。由于历史原因,命令行控制台文件在DOS操作系统和Windows操作系统中的文件名为”CON”,在其它的操作系统(例如Unix、Linux、Mac OS X、Android等等)中的文件名为”/dev/tty”。因此,在Windows中可以使用freopen( “CON”, “w”, stdout );其它操作系统中使用:freopen( “/dev/tty”, “w”, stdout );

输入重定向

#include<iostream>
using namespace std;
int main()
{
    double f;
    int n;
    freopen("t.txt","r",stdin); //cin被改为从t.txt中读取数据
    cin>>f>>n;
    cout<<f<<" "<<n<<endl;
    return 0;
}

运行结果:

流操纵算子

  • 整数流的基数:流操纵算子dec(十进制),oct(八进制),hex(十六进制),setbase(指定进制)

  • 浮点数的精度(precision, setprecision)

  • 设置域宽(setw, width)

  • 用户自定义的流操纵算子

    Notice:使用流操纵算子需要#include<iomanip>

整数流的基数

#include<iostream>
using namespace std;
int main()
{
    int n = 10;
    cout<<n<<endl;
    cout<<hex<<n<<endl;
    cout<<dec<<n<<endl;
    cout<<oct<<n<<endl;
    return 0;
}

运行结果:

控制浮点数精度的流操纵算子

precision, setprecision

precision是成员函数,其调用方式为: cout.precision(5);

setprecision是流操纵算子,其调用方式为: coutsetprecision(5);//可以连续输出

它们的功能相同: 1.指定输出浮点数的有效位数(非定点方式输出时) 2.指定输出浮点数的小数点的后的有效位数(定点方式输出时) 定点方式:小数点必须出现在个位数后面 e.g.以浮点数输出最多6位有效数字

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    double x = 1234567.89, y = 12.34567;
    int n = 1234567;
    int m = 12;
    cout<<setprecision(6)<<x<<endl;
    cout<<y<<endl;
    cout<<n<<endl;
    cout<<m<<endl;
    return 0;
}

运行结果:

e.g.以小数点位置固定的方式输出 setiosflags(ios::fixed)

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    double x = 1234567.89, y = 12.34567;
    int n = 1234567;
    int m = 12;
    cout<<setiosflags(ios::fixed)<<setprecision(6)<<x<<endl;
    cout<<y<<endl;
    cout<<n<<endl;
    cout<<m<<endl;
    return 0;
}

运行结果:

e.g.取消以小数点位置固定的方式输出 resetiosflags(ios::fixed)

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    double x = 1234567.89;
    cout<<setiosflags(ios::fixed)<<setprecision(6)<<x<<endl;
    cout<<resetiosflags(ios::fixed)<<x<<endl;
    return 0;
}

运行结果:

设置宽域的流操纵算子

setw,width 两者功能相同,一个是成员函数,另一个是流操纵算子,调用方式不同 cin»setw(4);或者cin.width(5); cout«setw(4);或者cout.width(5); e.g.

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    int w = 4;
    char string[10];
    cin.width(5);
    while (cin>>string)
    {
        cout.width(w++);
        cout<<string<<endl;
        cin.width(5);
    }
    return 0;
}

Notice:宽度设置有效性是一次性的,在每次读入和输出之前都要设置宽度。

分析: 首先执行while时1234会被读入string(因为还有’\0’),此时w=4并显示,之后w++,w=5,接着从输入流读取数据到string,因为刚才输入流为1234567890,其中1234已被读入,所以5678被读入string并显示,后面同理。

用户自定义流操纵算子

#include<iostream>
#include<ostream>
using namespace std;
ostream &tab(ostream &output)
{
    return output<<'\t';
}
int main()
{
    cout<<"aa"<<tab<<"bb"<<endl;
    return 0;
}

转载请注明原地址,小黑特的博客:http://te-shi.com 谢谢!

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦