【C++】IO流

在这里插入图片描述

目录

  • 一、C语言的输入与输出
  • 二、流是什么
  • 三、C++IO流
    • 3.1 C++标准IO流
    • 3.2 C++文件IO流
      • 3.2.1 二进制读写
      • 3.2.2 文本读写
  • 四、stringstream的简单介绍
  • 结尾

一、C语言的输入与输出

C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。如下图所示:

在这里插入图片描述

对输入输出缓冲区的理解:
1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序
2.可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。


二、流是什么

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bit,byte,packet )的抽象描述。
C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。
它的特性是:有序连续、具有方向性

为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能


三、C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
在这里插入图片描述

3.1 C++标准IO流

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。
在使用时候必须要包含文件并引入std标准命名空间。
注意

  1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。
  2. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位,程序继续。
  3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
  4. cin和cout可以直接输入和输出内置类型数据,原因:标准库已经将所有内置类型的输入和输出全部重载了:

在这里插入图片描述
在这里插入图片描述

  1. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。
  2. 在线OJ中的输入和输出:
    • 对于IO类型的算法,一般都需要循环输入:
    • 输出:严格按照题目的要求进行,多一个少一个空格都不行。
    • 连续输入时,vs系列编译器下在输入ctrl+Z时结束
#include<iostream>
#include<string>using namespace std;int main()
{// 单个元素循环输入int x = 0;while (cin >> x){// ...}// 多个元素循环输入int a = 0, b = 0, c = 0;while (cin >> a >> b >> c){// ...}// 整行输入string s;while (cin >> s){// ...}return 0;
}

那么为什么这里是什么作为判断条件进行循环的呢?

以前我们学习过能作为循环判断条件的只有 bool值、整形和指针类型,而这里cin的返回值是istream并不属于他们其中的一种,那是因为什么原因呢?

原因是C++设计了一个函数 operator bool 函数,istream的对象调用了operator bool,operator bool调用时如果接收流失败,或者有结束标志,则返回false,所以这里可以做逻辑条件值。

  1. istream类型对象转换为逻辑条件判断值

    istream& operator>> (int& val);
    explicit operator bool() const;
    

https://legacy.cplusplus.com/reference/ios/ios/operator_bool/

下面写一个Date类,并且在类中实现operator bool,如果Date类成员作为判断条件,那么Date类成员会调用operator boo l转换为 bool。

class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1 , int day = 1):_year(year),_month(month),_day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day << endl;return out;
}int main()
{Date date;// 由于Date类中定义了operator bool// 那么作为循环判断条件时,date可以调用operator bool转换为boolwhile (date){cin >> date;cout << date;}return 0;
}

既然上面提到了类对象可以通过operator bool函数将类对象转化为bool类型,那么下面整体讲一下类型转换。

类型转换

  1. 内置类型之间,相近类型可以相互转换

    int main()
    {int i = 520;double d = 13.14;cout << "i:" << i << "  d:" << d << endl;i = d;cout << "i:" << i << "  d:" << d << endl;d = i;cout << "i:" << i << "  d:" << d << endl;return 0;
    }
    
  2. 构造函数,若有其他类型想转换为当前自定义类型可以通过构造函数实现。
    自定义类型 <-- 内置类型 自定义类型 <-- 自定义类型

    class A
    {
    public:A(int i){// ...}
    };class B
    {
    public:B(const A& a){// ...}
    };int main()
    {// 自定义类型 <-- 内置类型int i = 520;A a = 1;string s = "I Love Y";// 自定义类型 <-- 自定义类型B b = b;string ss;string::const_iterator it = ss.begin();return 0;
    }
    
  3. operator type() 可以实现 内置类型 <-- 自定义类型

    class Convert
    {
    public:operator int(){// ...return 520;}
    };int main()
    {// 内置类型 <-- 自定义类型Convert con;int i = con;return 0;
    }
    

3.2 C++文件IO流

C++根据文件内容的数据格式分为二进制文件和文本文件。采用文件流对象操作文件的一般步骤:

  1. 定义一个文件流对象
    ifstream ifile(只输入用)
    ofstream ofile(只输出用)
    fstream iofile(既输入又输出用)
  2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
  3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
  4. 关闭文件

3.2.1 二进制读写

class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1 , int day = 1):_year(year),_month(month),_day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day << endl;return out;
}struct ServerInfo
{char _address[32];double _x;Date _date;
};// 二进制读写
class BinIO
{
public:BinIO(const char* filename = "info.txt"):_filename(filename){}void Write(const ServerInfo& winfo){ofstream ofs(_filename, ofstream::out | ofstream::binary);ofs.write((char*)&winfo,sizeof(winfo));}void Read(ServerInfo& rinfo){ifstream ifs(_filename, ifstream::in | ifstream::binary);ifs.read((char*)&rinfo, sizeof(rinfo));}
private:string _filename;
};// 写
int main()
{ServerInfo sinfo = { "192.128.64.32", 3.14, { 1949,10,1 } };BinIO BIO;BIO.Write(sinfo);return 0;
}
//int main()
//{
//	ServerInfo sinfo;
//
//	BinIO BIO;
//
//	BIO.Read(sinfo);
//
//	return 0;
//}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里提一个很多初学者可能犯的错误,那就是在结构体 ServerInfo 中,不使用char* 而使用string,会出现什么问题呢?我们使用代码展示一下

在这里插入图片描述

在这里插入图片描述

我们会发现写入文件时没有问题,但是读入内存中访问时程序崩溃了,其他的都读进去了,只有string读入有问题,为什么呢?从string的底层和操作系统的内存管理入手,string是如何存字符串的呢?
在这里插入图片描述
string中存储的_str,_capacity和_size,当把string以二进制的方式写进文件时,是将_str,_capacity和_size写入文件,而并未将string存储的字符串写入文件,那么以二进制读的方式读进内存中时,也是直接将_str,_capacity和_size读进内存,而写和读是两个进程,当写结束时,string中_str指向的内容会被销毁,当读时会将原来的_str读进来,而原来的空间已经被销毁了,那么这里的_str就是野指针,访问就会使程序崩溃。

上面是将读和写分为两个进程,那么将读和写写入一个进程会怎么样呢?
在这里插入图片描述

通过上面的图片可以发现,string的读写没什么问题,但是程序还是崩溃了,为什么呢?因为这里存在string浅拷贝的问题,析构时析构了两次导致了程序的崩溃。但是我们一般在使用的时候,读写不会在同一个进程。

在使用二进制读写时,不要使用容器,如果要使用容器就要使用下面的文本读写。

二进制读写有一个很大的问题,就是写进去的内容看不见可能是乱码。


3.2.2 文本读写

文本读写与二进制读写相比的难在将所有需要写入的数据转换为字节流,字节流可以通过字符串转换而来,那么这里的问题可以转化为将所有需要写入的数据转换为字符串。还是以结构体 ServerInfo 举例,ServerInfo中的string类型的数据可以使用c_str直接取到字符串,ServerInfo中的double类型的数据可以使用to_string转换为字符串,那么ServerInfo中的Date类型怎么处理呢?我们可以自己设计一个函数,将Date类型中的数据全部使用to_string转换为字符串再组合返回。

但是C++中有更为方便的方法,那就是使用ostream对象调用operator<<函数将数据写入到文件中,而这里的operator<<只有参数为内置类型时才能使用,如果有自定义类型应该怎么办呢?我们可以在自定义类型的类中重载一个operator<<,那么在写自定义类型数据时就可以调用它的operator<<将数据写入文件中了。同理,如果想要将文件中的内容读出来,就使用operator>>函数将数据读出,若有自定义类型,在自定义类型的类中重载一个operator<<函数。

顺便提一下,如果在纯C语言的情况下,也需要将数据转换为字节流,也可以说是转换为字符串,C语言中int类型可以使用itoa函数将int类型转换为字符串,那么如果是double类型呢?可能会有人想不到如何转换为double,其实很简单,C语言中有这么一个函数sprintf函数,可以将任意内置类型的数据转化为字符串,相比于itoa函数,使用sprintf函数会更好用一些。

class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1, int day = 1):_year(year), _month(month), _day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day << endl;return out;
}struct ServerInfo
{string _address;double _x;Date _date;
};// 文本读写
class TestIO
{
public:TestIO(const char* filename = "info2.txt"):_filename(filename){}void Write(const ServerInfo& winfo){// 覆盖写ofstream ofs(_filename);ofs << winfo._address << endl;ofs << winfo._x << endl;ofs << winfo._date << endl;}void Read(ServerInfo& rinfo){ifstream ifs(_filename);ifs >> rinfo._address;ifs >> rinfo._x;ifs >> rinfo._date;}
private:string _filename;
};
//int main()
//{
//	ServerInfo sinfo = { "https://blog.csdn.net/qq_55401402?spm=1011.2415.3001.5343", 
//		3.14, { 1949,10,1 } };
//
//	TestIO TIO;
//
//	TIO.Write(sinfo);
//
//	return 0;
//}// 读
int main()
{ServerInfo sinfo;TestIO TIO;TIO.Read(sinfo);cout << sinfo._address << endl;cout << sinfo._x << endl;cout << sinfo._date << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


四、stringstream的简单介绍

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?

  1. 使用itoa()函数
  2. 使用sprintf()函数
    但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。

在C++中,可以使用stringstream类对象来避开此问题。
在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作,本文主要介绍stringstream。
stringstream主要可以用来:

  1. 将数值类型数据格式化为字符串
#include<sstream>using namespace std;int main()
{int a = 12345678;string s;// 将一个整形变量转化为字符串,存储到string类对象中stringstream ss;ss << a;ss >> s;cout << ss.str() << endl;// clear()// 注意多次转换时,必须使用clear将上次转换状态清空掉// stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit// 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换// 但是clear()不会将stringstreams底层字符串清空掉// s.str("");// 将stringstream底层管理string对象设置成"",// 否则多次转换时,会将结果全部累积在底层stringss.clear(); // 清空s, 不清空会转化失败ss.str("");double d = 12.34;ss << d;ss >> a;string sValue;sValue = ss.str(); // str()方法:返回stringsteam中管理的string类型cout << sValue << endl;return 0;
}
  1. 字符串拼接
int main()
{stringstream sstream;// 将多个字符串放入 sstream 中sstream << "first" << " " << "string,";sstream << " second string";cout << "strResult is: " << sstream.str() << endl;// 清空 sstreamsstream.str("");sstream << "third string";cout << "After clear, strResult is: " << sstream.str() << endl;return 0;
}
  1. 序列化和反序列化结构数据
    序列化:将各种信息转换成字符串
    反序列化:将字符串中的信息提取出来转换为内存数据
#include<sstream>using namespace std;class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1, int day = 1):_year(year), _month(month), _day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day;return out;
}struct ChatInfo
{string _name; // 名字int _id; // idDate _date; // 时间string _msg; // 聊天信息
};int main()
{// 结构信息序列化为字符串ChatInfo winfo = { "张德帅", 1314520, { 2024, 6, 10 }, "出来耍"};ostringstream oss;oss << winfo._name << endl;oss << winfo._id << endl;oss << winfo._date << endl;oss	<< winfo._msg << endl;string str = oss.str();cout << str << endl ;// 我们通过网络这个字符串发送给对象,实际开发中,信息相对更复杂,// 一般会选用Json、xml等方式进行更好的支持// 字符串解析成结构信息ChatInfo rInfo;istringstream iss(str);iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;cout << "-------------------------------------------------------"<< endl;cout << rInfo._name << ' ';cout << rInfo._date << endl;cout << ":>" << rInfo._msg << endl;cout << "-------------------------------------------------------"<< endl;return 0;
}

注意:

  1. stringstream实际是在其底层维护了一个string类型的对象用来保存结果
  2. 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空。
  3. 可以使用s. str(“”)方法将底层string对象设置为""空字符串
  4. 可以使用s.str()将让stringstream返回其底层的string对象
  5. stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。
希望大家以后也能和我一起进步!!🌹🌹
如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18940.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发 | GitHub企业版常见问题解读

什么是GitHub企业版&#xff1f; GitHub企业版是一个企业级软件开发平台&#xff0c;专为现代化开发的复杂工作流程而设计。 作为可扩展的平台解决方案&#xff0c;GitHub企业版使组织能够无缝集成其他工具和功能&#xff0c;并根据特定需求定制开发环境&#xff0c;提高整体…

红黑树:高效平衡二叉树的奥秘

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 引言 在数据结构的奇妙世界里&#x1f9d0;&#xff0c;二叉搜索树就像一把神奇的钥匙&#xff0c;能高效地查找数据。但这把钥匙也…

[免费]SpringBoot公益众筹爱心捐赠系统【论文+源码+SQL脚本】

大家好&#xff0c;我是老师&#xff0c;看到一个不错的SpringBoot公益众筹爱心捐赠系统&#xff0c;分享下哈。 项目介绍 公益捐助平台的发展背景可以追溯到几十年前&#xff0c;当时人们已经开始通过各种渠道进行公益捐助。随着互联网的普及&#xff0c;本文旨在探讨公益事业…

【设计模式】03-理解常见设计模式-行为型模式(专栏完结)

前言 前面我们介绍完创建型模式和创建型模式&#xff0c;这篇介绍最后的行为型模式&#xff0c;也是【设计模式】专栏的最后一篇。 一、概述 行为型模式主要用于处理对象之间的交互和职责分配&#xff0c;以实现更灵活的行为和更好的协作。 二、常见的行为型模式 1、观察者模…

DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

基于单片机的开关电源设计(论文+源码)

本次基于单片机的开关电源节能控制系统的设计中&#xff0c;在功能上设计如下&#xff1a; &#xff08;1&#xff09;系统输入220V&#xff1b; &#xff08;2&#xff09;系统.输出0-12V可调&#xff0c;步进0.1V; &#xff08;3&#xff09;LCD液晶显示实时电压&#xff…

SpringBoot(7)-Swagger

目录 一、是什么 二、SpringBoot集成Swagger 三、配置Swagger 3.1 配置文档信息 3.2 配置扫描接口 3.3 配置Swagger开关 3.4 配置API分组 3.5 实体配置 四、常用注解 五、总结 一、是什么 是一款API框架&#xff0c;API文档和API定义同步更新&#xff0c;可以在线测…

Atlassian工具集:Jira与Confluence集成优势、使用技巧、更新功能等

本文由Atlassian全球白金合作伙伴-龙智翻译整理&#xff0c;深入探讨了Jira和Confluence最受欢迎的集成功能与技巧&#xff0c;期待为您新一年的团队协作开个好头。 此前&#xff0c;来自K15t 的Customer Advocate Matt Reiner 和Atlassian副产品经理David Olive在一场学习会议…

Qt QOpenGLShaderProgram详解

1. 概述 QOpenGLShaderProgram 是 Qt 框架中用于管理 OpenGL 着色器程序的类。它提供了一种方便的方式来创建、编译和链接着色器&#xff0c;以及管理着色器程序中的属性和统一变量。通过 QOpenGLShaderProgram&#xff0c;开发者可以轻松地将顶点着色器和片段着色器组合成一个…

小爱音箱控制手机和电视听歌的尝试

最近买了小爱音箱pro&#xff0c;老婆让我扔了&#xff0c;吃灰多年的旧音箱。当然舍不得&#xff0c;比小爱还贵&#xff0c;刚好还有一台红米手机&#xff0c;能插音箱&#xff0c;为了让音箱更加灵活&#xff0c;买了个2元的蓝牙接收模块Type-c供电3.5接口。这就是本次尝试起…

ESXi安装【真机和虚拟机】(超详细)

项目简介&#xff1a; ESXi&#xff08;Elastic Sky X Integrated&#xff09;是VMware公司开发的一种裸机虚拟化管理程序&#xff0c;允许用户在单一物理服务器上运行多个虚拟机&#xff08;VM&#xff09;。它直接安装在服务器硬件上&#xff0c;而不是操作系统之上&#xff…

本地通过隧道连接服务器的mysql

前言 服务器上部署了 mysql&#xff0c;本地希望能访问该 mysql&#xff0c;但是又不希望 mysql 直接暴露在公网上 那么可以通过隧道连接 ssh 端口的方式进行连接 从外网看&#xff0c;服务器只开放了一个 ssh 端口&#xff0c;并没有开放 3306 监听端口 设置本地免密登录 …

MyBatis-Plus模块扩展分页查询

文章目录 1.说明2.common-mybatis-plus-starter1.目录结构2.MybatisPLusAutoConfiguration.java 添加MyBatis Plus分页插件3.PlusPageResult.java MyBatis Plus 分页对象的增强版4.SunPlusPageHelper.java 分页工具类 3.EasyCode模板修改4.common-mybatis-plus-starter-demo 分…

TestHubo基础教程-创建项目

TestHubo是一款国产开源一站式测试工具&#xff0c;涵盖功能测试、接口测试、性能测试&#xff0c;以及 Web 和 App 测试&#xff0c;可以满足不同类型项目的测试需求。本文将介绍如何快速创建第一个项目&#xff0c;以快速入门上手。 1、创建项目 在 TestHubo 中&#xff0c;…

Pythong 解决Pycharm 运行太慢

Pythong 解决Pycharm 运行太慢 官方给Pycharm自身占用的最大内存设低估了限制,我的Pycharm刚开始默认是256mb。 首先找到自己的Pycharm安装目录 根据合适自己的改 保存&#xff0c;重启Pycharm

【Cocos TypeScript 零基础 15.1】

目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…

docker部署单机版doris,完整无坑

文章目录 一、部署1、修改内核参数2、下载Docker 开发环境镜像3、下载安装包4、启动镜像5、配置fe6、配置be7、远程连接 二、运维命令参考资料 一、部署 1、修改内核参数 在启动doris的be时&#xff0c;需要将 Linux 操作系统的内核参数设置为2000000&#xff0c;这里是Doris…

docker 进阶命令(基于Ubuntu)

数据卷 Volume: 目录映射, 目录挂载 匿名绑定: 匿名绑定的 volume 在容器删除的时候, 数据卷也会被删除, 匿名绑定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 绑定卷时修改宿主机的目录或文件, 容器内的数据也会同步修改, 反之亦然 # 查看所有 vo…

指针复习 ( 下 )

这是指针复习的第二篇&#xff0c;主要介绍指针与数组、函数的应用。 一、指针与数组 1.1 数组名的理解 在说明指针与数组的关系之前&#xff0c;我们必须要先了解「数组名」的意义 我们在指针复习 ( 下 ) 中&#xff0c;指针整数的部份有写过下面这段代码 int arr[10] {1,…

ElementUI 的组件 Switch(开关)如何让文字显示在按钮上

效果图&#xff1a; 一、引入switch组件 给组件自定义一个类&#xff1a;tableScopeSwitch&#xff0c;设置开关的值和对应展示的文字&#xff08;开为 1&#xff0c;并展示启用&#xff1b;关为 0&#xff0c;并展示禁用&#xff09;。 <div class"tableScopeSwitch…