C++【IO流】
创始人
2024-04-14 11:18:23
0

文章目录

  • 一、C语言的输入和输出
  • 二、C++中的IO流
    • 自动类型识别
    • scanf和cin等输入,都是通过空格或者换行分隔开来的
    • 多行测试用例如何写输入
  • 三、文件流
    • ifstream读取文件
      • 读取文件中不同类型的数据

一、C语言的输入和输出

C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。
注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。如下图所示:
在这里插入图片描述
这里的设备除了终端或者是控制台之外,还可能是磁盘文件,或者是网卡。

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

printf/scanf
fprintf/fscanf
sprintf/sscanf

int main()
{int a=0;printf("%d",a);scanf("%d",&a);printf("%d\n",a);}

二、C++中的IO流

在这里插入图片描述
istream:流提取
ostream:流输出
因为提取和输出都要写一个类,非常麻烦,就写了一个特iostream,继承了这两个类的功能
(但是因为这里存在菱形继承,所以非常复杂)

自动类型识别

int main()
{int i=0;double j=2.2;cout<

在这里插入图片描述
这是因为库底层都对其进行了函数的重载。

istream和ostream可以更好地支撑自定义类型对象的流插入和流提取。
自定义类型可以自己重载,控制流提取和流插入的方式。
(string,日期类都可以进行流插入和流提取的重载)

scanf和cin等输入,都是通过空格或者换行分隔开来的

#include
int main()
{int year ,month ,day;//输入多个值默认输入是用空格或者换行分隔开来的。cin>>year>>month>>day;scanf("%d%d%d",&year,&month,&day);scanf("%d %d %d",&year,&month,&day);//不需要去加空格//如果日期是20221128这样输入的//我们可以用这种方式将我们的日期进行分隔scanf("%4d%2d%2d",&year,&month,&day);cout<>str;year=stoi(str.substr(0,4));month=stoi(str.substr(4,2));day=stoi(str.substr(6,2));cout<

多行测试用例如何写输入

int main()
{int year ,month ,day;string str;//使用了operate bool//怎么终止?ctrl+c直接kill -9终止进程。//ctr+z给一个流结束的标志。while(cin>>str){year=stoi(str.substr(0,4));month=stoi(str.substr(4,2));day=stoi(str.substr(6,2));cout<

返回值是cin类型的对象。
一般是整型指针,比较运算符表达式道德结果可以做逻辑条件判断,0就是假,非0就是真,自定义类型一般是不能做while的条件类型判断的,这里存在隐式类型转换
想要让自定义类型能够进行转换,我们需要将其进行强制类型转换,但是一般用于类型转换的()被占用了,所以我们就用operator bool,将我们的类型转化成一个bool值,并将这个bool值进行返回。
在这里插入图片描述
这就类似于我们下面的将我们的自定义类型a赋值给内置类型int的过程。

class A
{
public:A(int a):_a(a){}
private:int _a;
};int main()
{//内置类型转换成自定义类型//隐式类型转换A aa1=1;//用1构造A的临时对象,再拷贝构造aa1,优化后直接构造aa1
}

如何让我们的自定义类型转换成内置类型

class A
{
public:A(int a):_a(a){}//重载运算符operator int(){return _a;}
private:int _a;
};int main()
{//自定义类型转换成内置类型1int i=aa1;cout<

三、文件流

ifstream读取文件

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

int main()
{ifstream  ifs("/Users/Test.cpp");//读取一个字符char ch=ifs.get();while(ifs){cout<

在这里插入图片描述

读取文件中不同类型的数据

这是我们test.txt中的内容
在这里插入图片描述

可以更好地兼容自定义类型的读写

class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}operator bool(){
// 这里是随意写的,假设输入_year为0,则结束if (_year == 0)return false;elsereturn true;}
private:int _year;int _month;int _day;
};
istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}
ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month <<" "<< d._day ;return out;
}
int main()
{ifstream  ifs("/Users/test.txt");//可以使用c语言的方式从文件中读取不同类型的数据
//    fscanf("%d%s%f",)//在c++中使用ifstream会方便一些int i;string s;double d;//对于自定义类型也是可以的//当然,可以的前提是日期类对象重载了流提取Date de;//流提取ifs>>i>>s>>d>>de;cout<

在这里插入图片描述

相关内容

热门资讯

高科技产业商业秘密保护的挑战与... 一、高科技产业商业秘密纠纷频发 智能驾驶、芯片、动力电池等高科技产业,商业秘密纠纷频发。2025年7...
百利科技(603959)披露公... 截至2025年12月31日收盘,百利科技(603959)报收于5.74元,较前一交易日下跌1.88%...
2025年山西破获经济犯罪案件... 中新网太原12月31日电 (记者 李庭耀)记者31日从山西省公安厅获悉,2025年,山西警方累计破获...
澄星股份:为员工提供符合国家法... 有投资者在互动平台向澄星股份提问:“您好,请问公司是否针对员工生育或育儿设有相关的福利或激励政策? ...
成都市新都区举行劳动纠纷处置比... 近日,2025年“新工司南”主题交流活动暨成都市新都区劳动纠纷处置比武竞赛在四川科伦药业股份有限公司...
2700余人“虚假住院”,成都... 记者12月31日从成都市公安局召开的2025年“向人民报告”刑侦专场新闻通气会上获悉,成都公安成功打...
首钢自动化申请法律文本审核方法... 国家知识产权局信息显示,北京首钢自动化信息技术有限公司申请一项名为“法律文本审核方法、装置和介质”的...
宜宾纸业(600793)披露全... 截至2025年12月31日收盘,宜宾纸业(600793)报收于21.1元,较前一交易日下跌3.39%...
激发行业协会商会发展活力,上海... 行业协会商会是推动经济社会高质量发展的重要力量。 近日表决通过的《上海市行业协会商会条例》(下称《条...
闪电律解|“退货羽绒服口袋现机... 齐鲁网·闪电新闻12月31日讯 近日,一则“退货羽绒服口袋现机票”的视频,引发网友热议。原来是供货厂...