C++的基本的输入输出流学习
C++的基本的输入输出流学习
前言:我相信许多人是学习了C语言之后才来学习的C++,而且输入输出流也是大多数的学习C++的开始部分,但是C++的输入输出流函数与C语言的不太相同,接下来我就给大家介绍一下,作者的的知识有限,也是想借着写文章这个方式梳理一下自己所学的知识,同时尽可能的帮助一下一些学习C++的小白们,如有讲错,请各位大佬纠正!
一、什么是输入输出(IO)流?
相信学习过了C或或者其它语言的同学们对IO流都不陌生,所谓的流(Stream)是比较专业的术语,我们可以粗略的把它理解为一条数据小溪,里面有着各种数据,就拿C语言的scanf、printf来说,当计算器监听键盘的输入,或者向屏幕输出数据时,相当于向这条小溪加入、拿走东西。
二、C++中的输入与输出
在Java、Python语言中都有着内置的输入输出语句,但是C++与C与语言一样是没有内置的输入输出语句的,C语言在stdio.h库中有着printf、scanf等输入输出语句,而C++包含了一个全面的标准库来提供IO流机制,也就是我们常用的iostream。
在iostream - C++ Reference网址中,我们可以知道iostream下有着两个基础类型istream(输入流)、ostream(输出流),而在iostream中定义有四个IO对象:cin(istream 标准输入流)、cout(ostream 标准输出流)、cerr、clog,这里我们着重讲的就是cin、cout这两个IO流对象。
三、cout(标准输出流)
cout是定义在std命名空间中的全局标准输出流对象,它可以可以将数据输出在标准输出(通常是屏幕)中,与C语言的printf相似。概念讲太多,人容易犯困,下面我们通过代码举例学习使用(这里我就使用VS2022)!
#include <iostream>int main() {int x = 1;double y = 2.5;char z = 'A';//C语言的输出语句printf("x:%d\n", x);printf("y:%.1f\n", y);printf("z:%c\n", z);printf("----------------------------------------\n");//C++的输出语句std::cout << "x:" << x << std::endl;std::cout << "y:" << y << std::endl;std::cout << "z:" << z << std::endl;return 0;
}
上面我们使用了两种代码(C\C++)来实现对int类型 x,double类型 y,char类型 z 进行了输出,同时根据代码我们会发现cout与printf输出的方式有很大的不同,cout的输出方式可以看作为 std::cout << 数据
显得十分的简单,假设我需要输出字符串,我们可以这样子写:
std::cout << "Hello World!";
cout的一些使用知识:
1. 自动识别输出类型:
在上面的代码中,如果我仔细观察我们可以发现,C的printf输出数据时,我需要自己定义输出格式,如:输出整形需要定义"%d"
,但是对于C++中的cout来说,我们只需要把我们的变量扔给cout,它就能够直接输出,这是cout与printf不同的地方之一!
2.可连续输出
在C语言中,如果我们需要将x、y、z合在一起输出,我们需要这样写:
printf("x:%d y:%.1lf z:%c\n", x, y, z);
同样的,在我们的cout中,我们也可以是实现这样的输出
std::cout << "x:" << x << " y:" << y << " z:" << z << std::endl;
cout 各个数据输入之间需要用 <<
操作符连接起来。
3.无法很好的对小数输出位数的控制
在C语言中,我们可以自由地控制我们浮点数的小数的输出位数比,如:
double Pi = 3.14159;
printf("%.1lf\n", Pi);//保留一位小数
printf("%.2lf\n", Pi);//保留两位小数
但是在C++中的cout,我们只能这么写:
std::cout << Pi << std::endl;
所以cout一般无法自己左右小数输出的位数,那么,有没有办法解决这种问题呢?我们可以通过 iomanip
库 来控制我们的输出格式,但是我们在这就不多讲了!
(选看) cout自动识别输出类型的原因我们可以简略的看一下上面提过的网站中的ostream的描述。
这涉及了运算符的重载与函数重载,ostream类中通过对函数重载,让不同的类型进入了不同的函数,也就实现了函数对内置类型(int、double、float)的自动识别。
连续输出的解释:
我们可以观察到,`<<` 运算符的重载函数返回值是 `ofstream&` 这是一个输出流对象的引用,其实就是我们的cout,其输出的样式应该是这样的:
四、cin(标准输入流)
cin是定义在std命名空间中的全局标准输入流对象,它可以读取标准输入(通常是键盘)的数据,并且把这些内容存储到我们定义的变量中,下面我们依旧结合着代码进行学习使用。
#include <iostream>int main() {int c_x, cpp_x;double c_y, cpp_y;char c_z, cpp_z;std::cout << "scanf输入:" << std::endl;scanf("%d %lf %c", &c_x, &c_y, &c_z);printf("c_x:%d c_y:%lf c_z:%c\n", c_x, c_y, c_z);std::cout << "cin输入:" << std::endl;std::cin >> cpp_x >> cpp_y >> cpp_z;std::cout << "cpp_x:" << cpp_x << " " << "cpp_y:" << cpp_y <<" " << "cpp_z:" << cpp_z << std::endl;return 0;
}
所以我们可以知道 cin 的用法与 cout 的用法是十分相似的只是符号有所不同,cin 的用法是 cin >> 变量名
,我们也可以发现,cin 与 cout 一样,不需要我们像C语言那样设置输入输出的格式,cin 会自动识别变量的类型,而且用的符号是 >>
与 cout 的 <<
是相反的。
(选看) cin自动识别变量类型的原因我们可以简略的看一下上面提过的网站中的istream的描述。
同样的我们发现,istream
对<<
运算符进行了重载,而且还有函数的重载,所以,才能识别不同变量的类型,对其准确的输入。
cin的输入的流程与cout的输出流程是一样的,同时也可以观察到>>
运算符的返回值是 istream&
我们可以通过画图解释
End
对于cout 与 cin 这个C++的大门我们就介绍到这里!作者的知识也比较有限,所以篇幅也比较少,如果有写错的地方有请各位大佬指正!也希望我的文章对大家有所帮助!