C++输入输出流

cin和cout充当了scanf和printf的功能,但是他们不是函数,而是类对象,那么我们有必要了解一下,他们是哪些类的对象。

关于输入输出流有下图这么一个整套的东西,这整套东西很复杂,我们一般来说不去研究,但是呢,我们可以从继承关系看出它属于哪个流类的对象,首先有一个叫ios_base,ios继承ios_base,这个箭头画的不对,真正的继承体系中,箭头应该指向父类。ios又派生了istream和ostream,然后cin又属于istream,cout、cerr、clog又属于ostream,然后istream和ostream又多继承出来一个iostream。这个图很复杂,我们看下面一个

C++输入输出流_第1张图片



所以我们用cin和cout要包含iostream,然后这里有一个ifstream,ofstream,还有一个fstream,我们今天先学istream,和ostream,然后再学其他的。

C++输入输出流_第2张图片

流类综述:

1.对象不可复制或赋值

什么意思呢

#include
#include

using namespace std;
//我们前面写过一个这个,这里为什么要传入引用呢,并且你除了传引用之外没有别的当时可以传,除非传指针。为什么呢,我们举个例子,我们fstream fs;一下,你编译一下是没有问题的,那你在fstream fs2(fs),这是拷贝构造把。然后你就会发现编译都编译不过去了,你可以发现他会报错,新版的是把这个函数给delete掉了,老版本的会说这个函数是私有的。所以这个东西是不可用的,赋值是一样的情况。所以说流类的赋值和拷贝都是不能用的。所以传递的时候只能传递指针或者引用。
//friend ostream & operator<<(ostream &)

int main()
{
#if 0
    fstream fs;
    fstream fs2(fs);
#endif 
    fstream fs;
    fstream fs2;
    fs2=fs;
    return 0;
}


2.流类对象是有缓冲的。

#include

using namespace std;

int main()
{
    //你随便写入一点东西,他不会一下子就写到屏幕上去的,它首先要写到缓冲里面去,等缓冲区满了再刷到屏幕上去。屏幕其实是个文件,你这样他就不会输出到屏幕上。
#if 0    
    cout<<"sadfaewfrwea";
    while(1);
#endif
//刷缓冲有如下几种方式:
//1.就是加endl;
//2.就是flush,这里有一点,他不会引入回车(换行)。这里的目的本来也就是不引入回车
//3.unitbuf
  //cout<<"sdfasdfsaf"<



#include
#include
using namespace std;

int main()
{
#if 0
    int a;
    //cin 背后是键盘
    //cout 背后是屏幕
    //cin>>a;
    //cout<>x>>y>>z;
    cout<>val和cout>>val是一样的,只不过这里是个函数
    char val;
    val=cin.get();
    cout.put(val);

}



#include
#include
#include
#include
using namespace std;


/*
 *cout:输出基本类型数据时,不必考虑数据是什么类型,系统会自动判断
 *     选择相应的重载函数;输出用户自己定义的类型数据时,要重载<<
 *     运算符。
 *cerr:是在屏幕上显示出错信息,与cout用法类似,不同的是只能在屏幕上,而不能
 *     在磁盘文件上输出错误信息。
 *clog:用法与cerr类似,不同点是它带有缓冲区。
 *这里用会cout其他的都一样的。
 */

int main()
{
#if 0
    //输出16进制
    int a=0x12345678;
    //关闭10进制
    cout.unsetf(ios::dec);
    //打开16进制
    cout.setf(ios::hex);
    cout<这个头文件,

    int x=0x123456;
    //输出16进制
    cout<=0;i--)
    cout.put(*(str+i));

    cout.put('\n');
#endif 

#if 0
在来看看cin

#endif

#if 0
    int a;
    double b;
    char buf[1024];
//你在这里输出如下
//12
//34.5
//ad  wer
//会输出12 34.5 ad;
//最后这个遇到空格就结束了。
//这是这个东西的一个弊端
//你比如说我现在就想读一整行,怎么办呢
//不方便的事情就由成员函数来弥补
    cin>>a>>b>>buf;
    cout<<"a = "<>a>>b>>c;
    cout<<"a = "<



#include
#include
using namespace std;

#if 0
iftream 定义一个文件输入对象
ostream 定义一个文件输出流对象
fstream 定义一个文件输入/输出流对象
#endif

int main()
{
#if 0
//和文件挂钩的方式有两种方式,第一种通过构造函数
//譬如 ifstream ifs("abc.txt");这个就表示输入用的。
//我们说的输入输出通常是不是对文件来说的,是对程序来说的
//你比如说ifstream做输入是指的它可以往我们程序里面输入数据,输出是指我们
//程序可以往外输出输出到文件上去。怎么判断对象和文件关联成功呢,以前我们打开文件要判断成不成功,在这个地方也有,就是下面的函数
    ifstream ifs("abc.txt");
//这里他既然敢用非的话说明:首先非是个运算符,你这个对象跟运算符单独放在一起说明它这个地方重载了运算符。这里会输出open error,因为你没有这个文件,如果你有这个文件就不会输出 error,读是可以读出来的,但是写就不能写了,你就要用另外一个ofstream;
    if(!ifs)
    {
        cout<<"open error"<>a>>b>>c;
    cout<

你可能感兴趣的:(C++学习)