文章目录

一:C语言的输入和输出及C++ IO流

(1)什么是流

(2)C++ I/O流

A:C++标准IO流

B:C++文件IO流

二:stringstream

(1)基本介绍

(2)引用

A:数据类型转换

B:字符串的拼接

一:C语言的输入和输出及C++ IO流

在C语言中,我们经常用到的输入和输出的函数共有三组

输入/输出

操作对象

printf/scanf

控制台

fprintf/fscanf

文件

sprintf/sscanf

字符数组(缓冲区)

而C++中对应的操作如下

输入/输出

操作对象

ostream/isream

控制台

ofstream/istream

文件

ostringstream/istringstream

字符数组(缓冲区)

(1)什么是流

流即流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据的抽象描述 C++流是指信息从外部输入设备(比如键盘)向计算机内部(内存)输入和从内存向外部输出设备(比如屏幕)的过程

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

(2)C++ I/O流

C++实现了一个庞大的类库,其中IOS为基类,其他类都是直接或间接派生自IOS类

我们进城使用的cin和cout就是该类的一个对象

C语言iostream no such c语言iostream函数_#include

A:C++标准IO流

**C++标准库提供了4个全局流对象:cin,cout,cerr,cblog。分别对应标准输入,标准输出,标准错误和标准日志 **

对于cin要特别注意以下几点

空格和回车都可以作为数据之间的分隔符,所以多个数据可以在一行输入,也可以分行输入。但是如果是字符型和字符串,则空格无法用cin输入,字符串中不能有空格,但是可以使用getline(cin,"this is a test")

在做算法题时,如果使用ACM模式,经常会让你自己写出输入的函数,所以`

//单个元素输入
(cin>>a)
{
//代码片段
}
//多个元素循环输入
(cin>>a>>b>>c)
{
//代码片段
}
//整行接受
(cin>>str)
{
//代码片段
}

B:C++文件IO流

C/C++根据文件内容的数据格式分为二进制文件和文本文件

C语言iostream no such c语言iostream函数_字符串_02

在C语言中读写文件其实是一个相对比较繁琐的操作,因为有很多参数需要记忆,而且还要打开文件关闭文件。但是在C++中,++;我们使用的仍然是面向对象的思想。

我们主要会使用到两种文件流:

ifstream ifile(只做输入)
ofstream ofile(只做输出)
实例化后对象之后,文件操作就变成了调用这些对象的接口的操作了。
如下,我们用一个服务器的ip及端口号信息进行演示,它封装在一个结构体SeverInfo中
struct ServerInfo
{
char _ip[32];//Ip地址
int _port;//端口号
};
我们创建一个类ConfigManager,这个类所做的工作就是将数据写入到文件,或者文件读取内存等操作
首先是类的成员,类里面的成员就定义一个string,这个string存放的是到时候要将数据写入到磁盘上的文件名,这里我定义为myconfig.txt
class ConfigManager
{
public:
ConfigManager(const char* configfile = "myconfig.txt")//构造
:_configfile(configfile)
{}
private:
string _configfile;//配置文件名字
};

首先进行的是打开文件以二进制的方式写入结构体的内容,需要使用到的流是ofstream,其构造函数是

explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);

其中第一个参数就是配置文件名,++;第二个参数需要制定使用二进制的方式打开写入

ofstream对象的write方法的参数为

ostream& write (const char* s, streamsize n);

第一个参数是其实地址,由于是二进制的方式写,所以我们将其强转为char*

接着是使用二进制的方式打开读入,需要使用的流是ifstream和read方法

所以二进制的读写如下

void WriteBin(const ServerInfo& info)
{
ofstream ofs(_configfile);//二进制写入对象
ofs.write((const char*)& info, sizeof(ServerInfo));//写入
}
void ReadBin(const ServerInfo& info)
{
ifstream ifs(_configfile);//二级制从某文件读取
ifs.read((char*)& info, sizeof(ServerInfo));//读入
}
int main()
{
ConfigManager conf;
ServerInfo W_info;
ServerInfo R_info;
strcpy(W_info._ip, "198.168.0.1");
W_info._port = 22;
conf.WriteBin(W_info);//二进制写入到磁盘
conf.ReadBin(R_info);//然后读取的R_info中
cout << R_info._ip << endl;
cout << R_info._port << endl;
}

C语言iostream no such c语言iostream函数_字符串_03

然后,对于文本读写在C++则是非常简单,因为ofstream和ifstream都分别重载了<>运算符

void WriteText(const ServerInfo& info)//文本方式写入
{
ofstream ofs(_configfile);
ofs << info._ip << endl;
ofs << info._port << endl;//注意加入换行符,不然分不清楚
}
void ReadText(ServerInfo& info)
{
ifstream ifs(_configfile);
ifs >> info._ip;
ifs >> info._port;
}
int main()
{
ConfigManager conf;
ServerInfo W_info;
ServerInfo R_info;
strcpy(W_info._ip, "198.168.0.1");
W_info._port = 22;
conf.WriteText(W_info);
conf.ReadText(R_info);
cout << R_info._ip << endl;
cout << R_info._port << endl;
}

C语言iostream no such c语言iostream函数_#include_04

二:stringstream

(1)基本介绍

定义了三个类,分别为istringstream,ostringstream和stringstream。其中最为重要的就是stringstream

(2)引用

A:数据类型转换
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
stringstream sstream;
string strResult;
int nValue = 1000;
// 将int类型的值放入输入流中
sstream << nValue;
// 从sstream中抽取前面插入的int类型的值,赋给string类型
sstream >> strResult;
cout << "[cout]strResult is: " << strResult << endl;
printf("[printf]strResult is: %sn", strResult.c_str());
return 0;
}

C语言iostream no such c语言iostream函数_c语言-1 infoo_05

.str()方法是将stringstream类型转换为string

B:字符串的拼接

#include 
#include 
#include 
using namespace std;
int main()
{
stringstream sstream;
// 将多个字符串放入 sstream 中
sstream << "first" << " " << "string,";
sstream << " second string";
cout << "strResult is: " << sstream.str() << endl;
// 清空 sstream
sstream.str("");
sstream << "third string";
cout << "After clear, strResult is: " << sstream.str() << endl;
return 0;
}

C语言iostream no such c语言iostream函数_字符串_06

如上,可以将多个字符串放入stringstream中,以达到拼接的目的

str("")和clear()的区别:clear()不会清空内容,他只是把最初对字符串转换类型等操作清除而已,相当于“初始化”。如果转换成int,那么就不能把向原字符串添加内容了,这时候可以使用clear(),str()只是把内容变成“”,而且也没有办法向里面添加内容了,后面跟一个clear()的话就可以添加内容了