C++——IO流
创始人
2024-05-30 21:27:42
0

目录

C语言的输入与输出

 流是什么

C++IO流

 C++标准IO流

 C++文件IO流

二进制读写 

文本读写 

 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类

 ostream/istream更好支持自定义类型对象的流插入和流。

 C++标准IO流

 C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内
存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还
提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、
cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不
同。
在使用时候必须要包含文件并引入std标准命名空间。
注意:
1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输
入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法
挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。
2. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对
应位置位(置1),程序继续。
3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输
入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有
空格。回车符也无法读入。
4. cin和cout可以直接输入和输出内置类型数据,原因:标准库已经将所有内置类型的输入和
输出全部重载了。 

这种多个测试用例得按ctrl+z或ctrl+c进行终止 

string其实是调用了重载 

内置类型转换成自定义类型

 这样可以支持自定义类型转为内置类型

 

 C++文件IO流

 C++根据文件内容的数据格式分为二进制文件和文本文件。采用文件流对象操作文件的一般步
骤:
1. 定义一个文件流对象
ifstream ifile(只输入用)
ofstream ofile(只输出用)
fstream iofile(既输入又输出用)
2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
4. 关闭文件

头文件

 文件流和IO流用法相似,ifstream在定义一个文件的时候,可以直接输入文件名把文件打开,ifstream防拷贝

打开文件的方式跟之前基本一样,差异不大,有close我们一般不用,因为有析构函数,析构函数会关闭文件

 get

get依赖于operator bool

 跳转了解C++文件读写

 ifs也有流提取,能提取自定义类型的前提是该类型重载了流提取。

读取  

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;
}

二进制读写:在内存中如何存储,就如何写道磁盘文件中。 优点:快,缺点:写出去内容看不见。

 文本读写:对象数据序列化字符串写出去,读回来的也是字符串,反序列化转换成对象数据。优点:可以看见写出去是什么。缺点:存在一个转换过程,要慢一些。

ofstream是写,下面是它的介绍,第二个参数是打开模式 

 文件进行写操作

 

二进制读写 

 进行二进制读写小测试

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include 
#include
using namespace std;
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;
}struct ServerInfo
{//char _address[32];string _address;int _port;  // 100Date _date;
};
struct ConfigManager
{
public:ConfigManager(const char *filename="server.config"):_filename(filename){}void WriteBin(const ServerInfo& info)//以二进制方式写{ofstream ofs(_filename,ios_base::out|ios_base::binary);//第二个参数是以二进制方式打开ofs.write((char*)&info, sizeof(info));//对文件进行写操作}
private:string _filename;
};
int main()
{ServerInfo winfo = {"127.0.0.1",888};ConfigManager cm;cm.WriteBin(winfo);return 0;
}

 读操作

以二进制文件进行读,这里用的是string,读的时候程序会崩溃

 换成字符数组不会报错,这是因为

 此时再换成string,先写

 再读,此时程序直接崩溃,啥都不显示

这是因为string结构是这样,字符串短的时候存在buff中,长的时候在堆上,当我们写出去的时候,写出去的是一个地址,这个地址是我们第一次进行写的地址,注意这里是分别执行写和读,当写结束之后,该地址就被销毁,而读的时候仍然去该地址进行读取 就会报错,因为这里已经是野指针了。

文本读写 

文本写,如果这里要写入日期类,会比较麻烦

 

 文件读,这里如果读日期类,也会很麻烦

我们可以用流插入和流提取来进行优化,这里由于我们写的日期类重载了流插入和流提取,所以能直接对日期类进行流插入和提取操作,注意要加换行或空格,不然会数据会挨在一起

	void WriteText(const ServerInfo& info){ofstream ofs(_filename, ios_base::out);ofs << info._address << endl;ofs << info._port << endl;ofs << info._date << endl;}void ReadText(ServerInfo& info){ifstream ifs(_filename, ios_base::in | ios_base::binary);ifs >> info._address >> info._port >> info._date;}

 

 stringstream的简单介绍

 在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?
1. 使用itoa()函数
2. 使用sprintf()函数
但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,
而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。

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

它也有流插入和流提取
序列化
 

反序列化

 可以用stringstream代替istream和ostream,stringstream集后俩者功能与一体

相关内容

热门资讯

新入职员工表态发言稿 新入职员工表态发言稿(精选6篇)  在发展不断提速的社会中,越来越多地方需要用到发言稿,发言稿在写作...
运动会垒球通讯稿 运动会垒球通讯稿(精选22篇)  大家最不陌生的就是通讯稿了吧,通讯稿的使用频率呈上升趋势,无论是在...
大学生学代会竞选稿 大学生学代会竞选稿  竞选稿是竞选者通往竞选大门的“敲门砖”,一份优秀的竞选稿往往会使竞选者达到事半...
竞选团支书竞选稿 竞选团支书竞选稿7篇  在日新月异的现代社会中,我们都不可避免地要接触到竞选稿,竞选稿可以帮助竞选者...
小学足球说课稿 小学足球说课稿范文(精选3篇)  在教学工作者开展教学活动前,很有必要精心设计一份说课稿,借助说课稿...
卖火柴的小女孩的小学评课稿 卖火柴的小女孩的小学评课稿  篇一:《卖火柴的小女孩》评课稿  一、课堂导入新颖。  常言道:“良好...
《石头书》第一课时说课材料 《石头书》第一课时说课材料  一、说教材  本文是一篇科学小品,通过川川和磊磊两个孩子与勘探队员的交...
军训学生代表发言稿 军训学生代表发言稿(通用15篇)  在不断进步的时代,很多地方都会使用到发言稿,发言稿是在一定的场合...
家长会学生代表的优秀发言稿 家长会学生代表的优秀发言稿(精选10篇)  在当今社会生活中,能够利用到发言稿的场合越来越多,发言稿...
五月份国旗下讲话稿 五月份国旗下讲话稿范文(精选3篇)  在快速变化和不断变革的今天,各种讲话稿频频出现,绝大多数的讲话...
交流会活动通讯稿 交流会活动通讯稿  交流会活动通讯稿分享给大家,交流会活动目的是为营造健康积极的文化氛围,提升团队整...
交通安全主题广播稿 交通安全主题广播稿范文(通用8篇)  有在广播站锻炼的同学们都知道,大家广播前都会提前做好广播稿,漂...
小学六年级毕业典礼主持稿 小学六年级毕业典礼主持稿(精选6篇)  在社会发展不断提速的今天,各种主持稿频频出现,主持稿是主持人...
揭牌仪式讲话稿 揭牌仪式讲话稿10篇  在快速变化和不断变革的今天,能够利用到讲话稿的场合越来越多,讲话稿可以帮助发...
发言稿怎么写 发言稿怎么写  一、发言稿格式  开场白  1、设问法(能与听众交流)。  2、情境法(引导听众进入...
《山中访友》说课稿 《山中访友》说课稿(通用15篇)  作为一名专为他人授业解惑的人民教师,常常要写一份优秀的说课稿,说...
《春天举行音乐会》说课稿 《春天举行音乐会》说课稿  在教学工作者实际的教学活动中,通常会被要求编写说课稿,编写说课稿是提高业...
八年级下册第三单元《喂——出... 八年级下册第三单元《喂——出来》说课稿  一、说教材  (一)教材定位:  《喂──出来》是人民教育...
运动会的加油稿 运动会的加油稿(精选50句)  运动健将们,用你的实力,用你的精神,去开拓出,一片属于你的天地!接下...
高中家长会家长代表发言稿精选   有一个良好的学习氛围,每一个学生都受益。下面是小编整理的高中家长会家长发言稿,欢迎参考。  篇一...