作者:顺大顺麻麻1009_388 | 来源:互联网 | 2023-09-24 10:10
文章目录
- 一、C语言的输入输出
- 二、什么是流
- 三、C++的IO流
- 1.概览
- 2.标准IO流
- (1)cin、cout、cerr、clog
- (2)cin、cout与scanf、printf
- (3)输入输出重载
- (4)getline
- (5)循环输入
- 2.文件流fstream
- (1)ifstream、ofstream
- (2)用法
- 3.字符串流sstream
- (2)写
- 感谢阅读,如有错误请批评指正
一、C语言的输入输出
C语言中最常用到的输入输出方式就是scanf()与printf()。 scanf()是从标准输入设备(键盘) 读取数据,并将值存放在一个或一些变量中;printf()是将指定的文字/字符串输出到 标准输出设备(屏幕)。
C语言借助了相应的缓冲区来进行输入与输出。如下图所示:
对输入输出缓冲区的理解:
- 可以屏蔽掉低级IO的实现,低级IO的实现一般都依赖操作系统内核的实现,如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
- 可以实现“行”读取的行为,对于计算机而言是没有“行”这个概念的,但有了这部分,就可以定义出来“行”的概念,然后解析缓冲区的内容,返回一个“行”。
二、什么是流
“流”即是流动,是物质从一处向另一处流动的过程。具体到这里,是对一种有序、连续、有方向性的数据(其单位可以是bit,byte,packet)的抽象描述。
C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。
它的特性是:有序、连续、具有方向性
为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流或流类,用以完成某方面的功能,下面将介绍这些流。
三、C++的IO流
1.概览
C++系统实现了一个庞大的类的库,如下图所示。其中ios为基类,其他类都直接或间接派生自ios类。
2.标准IO流
(1)cin、cout、cerr、clog
C++标准库提供了4个全局流对象cin、cout、cerr、clog。使用cout进行标准输出,即数据从内存流向控制台(显示器);使用cin进行标准输入,即数据通过键盘输入到程序中;使用cerr用来进行标准错误的输出;使用clog进行日志的输出。
从前图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象基本没有区别,只是应用场景不同。
如下图所示都是向显示器输出,本意是希望一般的输出用cout,错误输出用cerr,日志输出用clog,但一般很少用到后两个,全部用cout输出。
运行结果如下:
(2)cin、cout与scanf、printf
C++提供了cin、cout,C语言提供了scanf、printf,他们都可以进行输入输出,但建议能用cin、cout就优先用这两个,如果遇到格式化输入输出时用scanf、printf(cin、cout同样可以格式化输入输出,但是使用起来比较复杂,不如直接用现成的scanf、printf)。
同时,由于C++在某些方面与C语言有较大差异,有时混用四个输入输出也会出现问题。
比如字符串string在C++中用size值来标记字符串的结尾,而C语言下用’\0’来标示字符串的结尾,这一个差异在输入输出时就可能会产生问题,为此string还特意提供了c_str()来用于C语言下的操作。
(3)输入输出重载
cin和cout可以直接输入和输出内置类型(如int、double等)和部分标准自定义类型(如string等),原因是标准库已经将所有这些类型的输入和输出重载了,直接使用即可。
对于我们自定义的类型&#xff0c;如果想直接使用cin、cout来输入输出&#xff0c;需要自己重载>>和<<&#xff0c;否则不能直接使用。
&#xff08;4&#xff09;getline
同scanf一样&#xff0c;cin也是以空格和换行为间隔分割数据&#xff0c;所以对于一行有空格的数据&#xff0c;它并不能全部读取&#xff0c;这时就要用到getline&#xff0c;getline以换行为间隔分割数据&#xff0c;如下图所示。
运行结果如下&#xff1a;
&#xff08;5&#xff09;循环输入
当输入若干行内容时&#xff0c;可以用如下的解决方式。
运行结果如下&#xff1a;
类似于C语言中&#xff1a;
char buffer[100];
while(scanf("%s", buffer) !&#61; EOF)
{
}
可以用Ctrl&#43;C来结束输入&#xff0c;其本质是向该进程发送了信号&#xff0c;具体可见【万字详解Linux系列】进程信号&#xff0c;在Linux下和Windows下都是一样的道理。
2.文件流fstream
&#xff08;1&#xff09;ifstream、ofstream
ifstream如下创建一个对象&#xff0c;name是文件名&#xff0c;mode是操作的方式。
ifstream ifs(name, mode);
mode有如下几种可供选择&#xff1a;
ifstream对象可调用的成员函数&#xff0c;常用的有get&#xff0c;getline&#xff0c;read&#xff0c;seekg&#xff0c;tellg等。通过函数名即可大致了解其作用。get一次获取文件的一个字符&#xff0c;getline一次获取文件的一行&#xff0c;read从文件中读一段内容&#xff0c;seekg设置文件指针的位置&#xff0c;tellg查找文件指针的位置。
&#xff08;2&#xff09;用法
- 定义一个文件流对象&#xff1a;ifstream(只输入用)、ofstream(只输出用)、fstream(既输入又输出用)
- 使用文件流对象的成员函数打开一个磁盘文件&#xff0c;使得文件流对象和磁盘文件之间建立联系
- 使用提取和插入运算符对文件进行读写操作&#xff0c;或使用成员函数进行读写
- 关闭文件
类似于C语言的用法
下面的两段代码分别演示ifstream和ofstream对文件读写&#xff0c;写法类似于C语言中的fread、fwrite这些接口&#xff0c;只不过是变成了面向对象而已。
下面这段代码是用ifstream读文件中的内容。
运行结果如下&#xff1a;
下面这段代码是用ofstream向文件中写入内容&#xff0c;使用方法基本同ifstream。
运行结果如下&#xff1a;
C&#43;&#43;的用法
下面是C&#43;&#43;提供的文件流的新用法&#xff0c;文件流也是流&#xff0c;所以他也可以用<<或>>来进行读写&#xff0c;用法如下。
代码如下&#xff1a;
void WriteFile()
{ofstream ofs("write.txt");char c &#61; &#39;h&#39;;string str &#61; "ello world";ofs << c << str;
}int main()
{WriteFile();return 0;
}
这样ofstream的对象也可以像cout那样通过流来向文件写入内容。
运行结果如下&#xff1a;
ifstream使用方法同理&#xff0c;只不过流的方向要反一下&#xff0c;这里不再赘述。
3.字符串流sstream
sstream中包括istringstream、ostringstream 和 stringstream三个流&#xff0c;分别用来进行流的输入、输出和输入输出操作&#xff0c;但使用时一般直接用stringstream比较方便。
&#xff08;1&#xff09;读
代码如下&#xff1a;
#include
#include using namespace std;struct ServerInfo
{string ip;int port;
};int main()
{stringstream ss;ServerInfo info &#61; { "192.0.0.1",8081 };ss << info.ip << " " << info.port;string str &#61; ss.str();cout << str << endl;return 0;
}
运行结果如下&#xff0c;对字符串的处理非常方便。
运行结果如下&#xff1a;
&#xff08;2&#xff09;写
在前面读的基础上再向新的结构体写入已读入的内容。
代码如下&#xff1a;
#include
#include using namespace std;struct ServerInfo
{string ip;int port;
};int main()
{stringstream ss;ServerInfo info &#61; { "192.0.0.1",8081 };ss << info.ip << " " << info.port;ServerInfo newInfo;ss >> newInfo.ip >> newInfo.port;return 0;
}
运行结果如下&#xff1a;
感谢阅读&#xff0c;如有错误请批评指正