• C++IO流


    前言

    这一讲讲io流
    在这里插入图片描述

    1. cout,cin

    1.1 cout,cerr,clog

    cout << "11111" << endl;
    cerr << "11111" << endl;
    clog << "11111" << endl;
    

    在这里插入图片描述

    1.2 四个状态

    在这里插入图片描述
    io流总共有四个状态,good表示这个可以正常读取,eof表示读取到了文件末尾
    fail读取异常结束,bad就是io流本身出现了问题,这个我们一般遇不到

    string s;
    while (cin >> s)
    {
    	cout << s;
    }
    

    这个程序要结束就是输入ctrl+z,加回车
    这个的作用就是设置fail
    而退出while循环还可以ctrl+c,这个比较暴力,就是直接结束程序,不运行后面的了,
    ctrl+z还可以运行后面的

    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    
    string s;
    while (cin >> s)
    {
    	cout << cin.good() << endl;
    	cout << cin.eof() << endl;
    	cout << cin.fail() << endl;
    	cout << cin.bad() << endl;
    	cout << s;
    }
    
    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    

    调用对应函数,我们就可以查看IO流的状态
    在这里插入图片描述
    看得出来,IO流要正常运行,就必须要good状态为1,其余为0
    Ctrl+z就是将fail设为1,eof设为1,good设为0,所以就不行了

    string s;
    while (cin >> s)
    {
    	cout << cin.good() << endl;
    	cout << cin.eof() << endl;
    	cout << cin.fail() << endl;
    	cout << cin.bad() << endl<<endl;
    	cout << s<<endl;
    }
    
    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    
    string s1;
    while (cin >> s1)
    {
    	cout << s1<<endl;
    }
    

    在这里插入图片描述
    而且good状态一旦为0,就无法在继续正常使用IO流了,除非更改状态

    在这里插入图片描述
    这些函数都是可以更改状态的,但不如clear,clear就是将状态设置为最开始的状态的

    cout << "11111" << endl;
    cerr << "11111" << endl;
    clog << "11111" << endl;
    
    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    
    string s;
    while (cin >> s)
    {
    	cout << cin.good() << endl;
    	cout << cin.eof() << endl;
    	cout << cin.fail() << endl;
    	cout << cin.bad() << endl<<endl;
    	cout << s<<endl;
    }
    
    cin.clear();
    
    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    
    string s1;
    while (cin >> s1)
    {
    	cout << s1<<endl;
    }
    

    在这里插入图片描述

    1.3 缓冲区

    int j = 0;
    cin >> j;
    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    cout << j<<endl;
    int i;
    cin >> i;
    cout << i<<endl;
    

    在这里插入图片描述
    当输入123s的时候,就相当于向缓冲区中输入了123s,当用整型j读取的时候,只会读取j,当读取i的时候,就不会让我们输入了,因为缓冲区中还有东西,但是无法读取这个字母,所以缓冲区中还有一个s字母,但是cin的时候都会把这个数据设置为0,所以i为0,还有就是没有读取到是不会影响状态的,但是读取失败就会影响状态了

    int j = 0;
    cin >> j;
    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    cout << j<<endl;
    int i;
    cin >> i;
    cout << i<<endl;
    cout << cin.good() << endl;
    cout << cin.eof() << endl;
    cout << cin.fail() << endl;
    cout << cin.bad() << endl;
    

    在这里插入图片描述
    因为wer对应不上整型,所以状态变为fail,这都是缓冲区的问题

    	char c = 0;
    	while (cin.get(c))
    	{
    		///
    	}
    

    我们可以这样,把缓冲区里的字符读入c中,这样缓冲区就干净了,然后ctrl+z,后面再clear

    	// 在io需求比较高的地方,如部分大量输入的竞赛题中,加上以下3行代码
    // 可以提高C++IO效率
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    

    下面说明第一行,首先C语言和C++都有各自的缓冲区
    如果这样
    printf(“a”);
    cout<<‘b’;
    printf(“c\n”);
    ac存入C语言的缓冲区,b存入C++的缓冲区
    但是,因为换行具有刷新缓冲区的作用,所以正常来说,会先打印ac,再打印b,但是系统会处理这个问题,处理就会降低效率,第一行就是取消这个处理
    第二行是因为,C++中,cin的缓冲区和cout的也有关联,cin的刷新,也会带动cout的刷新,所以会降低效率,这两行就是取消这个特性

    反正记住可以提高效率就可以了

    2. 文件流

    在这里插入图片描述
    直接讲使用
    要有头文件fstream

    ofstream os;
    os.open("test.txt");
    

    在C++中IO流都是类
    这个是写入文件,没有文件就创造文件

    ofstream os("test.txt");
    

    还可以这样写
    向文件中写入数据的时候,除了调用特定的函数外,还可以直接用<<重载

    os << "asdfgghj"<<endl;
    os << 1<<endl;
    

    在这里插入图片描述
    要关闭文件,也不用调用close,因为类有析构函数

    ifstream is("test.txt");
    string s;
    int i;
    char c;
    while (is >> c)
    {
    	cout << c;
    }
    

    这个就可以打印出文件中的所有内容

    ifstream is("test.txt");
    string s;
    int i;
    is >> s >> i;
    cout << s << endl;
    cout << i << endl;
    

    这个就可以得到文件中的内容存到数据中,怎么写入的就怎么读取

    ofstream os("test.txt");
    Date d(2024, 9, 15);
    cout << d;
    os << d;
    

    在这里插入图片描述
    在这里插入图片描述
    对于自定义类型的文件存贮,这个自定义类型cout重载怎么打印的,就怎么存储在文件中

    ifstream is("test.txt");
    Date d;
    is >> d;
    cout << d;
    

    在这里插入图片描述
    当然怎么存的就怎么读取,肯定是不会出错的

    //string s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
    //ofstream os("test.txt");
    //os << s;
    
    string s;
    ifstream is("test.txt");
    is >> s;
    cout << s;
    

    在这里插入图片描述
    对于动态开辟的也是这样的

    string s("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
    ofstream os("test.txt",ios_base::out|ios_base::binary);
    os << s;
    

    如果要二进制写入的话,就要在后面加上这个东西,因为默认是ios_base::out写入,就不是二进制写入,加上|ios_base::binary就可以二进制写入了,二进制写入的,我们看到就是乱码
    在这里插入图片描述
    在这里插入图片描述
    当然全是字符a写入,我们看到的还是字符a,换一下就可以了

    string s("aaaaaaaaa好吃得混吃等死刺激我aaaaaaaaa");
    ofstream os("test.txt",ios_base::out|ios_base::binary);
    os << s;
    

    在这里插入图片描述

    string s;
    ifstream is("test.txt", ios_base::in | ios_base::binary);
    is >> s;
    cout << s;
    

    在这里插入图片描述
    这个就是二进制读

    3. 字符串流

    这个流就也是很简单了,和前面的很类似
    头文件sstream
    在这里插入图片描述

    ostringstream oss;
    oss << "123456" << "asdfg" << 1 << 233;
    cout << oss.str();
    

    在这里插入图片描述

    这个流,就是把内容存在字符串中,字符串就在类中
    oss中存在一个string类型的成员变量,所以可以存储
    str()就可以访问到这个字符串了

    ostringstream oss("111qqdddaaaaaa");
    //oss << "123456" << "asdfg" << 1 << 233;
    cout << oss.str()<<endl;
    oss << "123456" << "asdfg" << 1 << 233;
    cout << oss.str()<<endl;
    oss << "ssssssssssssssssssss";
    cout << oss.str() << endl;
    

    当然还可以构造函数那里存,只不过后来会覆盖

    ostringstream oss;
    oss << "123456" << "asdfg" << 1 << 233;
    cout << oss.str() << endl;
    
    istringstream iss(oss.str());
    string s;
    iss >>s;
    cout << s;
    

    ostringstream 是把数据放入字符串中,那么istringstream 就是将数据从字符串中取出了
    在这里插入图片描述

    总结

    这就是IO流的博客了,因为在上学,所以博客以后可能都会写的比较少

  • 相关阅读:
    菁染料CY7.5标记海藻酸钠|CY7.5-海藻酸钠|alginate-Cyanine7.5|CY7.5-peg-海藻酸钠alginate
    也谈数据治理
    Ignite实战
    DevExpress WinForms是一款全球顶级的用户界面控件套包
    Nginx开启Brotli
    神经网络的图像识别技术,神经网络识别物体形状
    C++ 语言学习 day01 (linux ),基本输入输出错误输出函数,名字空间的含义,内联函数,缺省参数,引用 ,、new操作符
    服务器为什么要一直开机?
    平面设计实验七 制作立体系统设置图标
    [C国演义] 第十五章
  • 原文地址:https://blog.csdn.net/2302_79981885/article/details/142284335