【摘要】 一:C语言的输入和输出及C++ IO流在C语言中,我们经常用到的输入和输出的函数共有三组输入/输出 操作对象printf/scanf 控制台fprintf/fscanf 文件sprintf/sscanf 字符数组(缓冲区)而C++中对应的操作如下输入/输出 操作对象ostream/isream 控制台ofstream/istream 文件ostrin…
一: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就是该类的一个对象
在这里插入图片描述
A:C++标准IO流
**C++标准库提供了4个全局流对象:cin,cout,cerr,cblog。分别对应标准输入,标准输出,标准错误和标准日志 **
对于cin要特别注意以下几点
空格和回车都可以作为数据之间的分隔符,所以多个数据可以在一行输入,也可以分行输入。但是如果是字符型和字符串,则空格无法用cin输入,字符串中不能有空格,但是可以使用getline(cin,”this is a test”)
在做算法题时,如果使用ACM模式,经常会让你自己写出输入的函数,所以`
//单个元素输入
while(cin>>a)
{
//代码片段
}
//多个元素循环输入
while(cin>>a>>b>>c)
{
//代码片段
}
//整行接受
while(cin>>str)
{
//代码片段
}
B:C++文件IO流
C/C++根据文件内容的数据格式分为二进制文件和文本文件
在这里插入图片描述
在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);
1
其中第一个参数就是配置文件名,第二个参数需要制定使用二进制的方式打开写入
ofstream对象的write方法的参数为
ostream& write (const char* s, streamsize n);
1
第一个参数是其实地址,由于是二进制的方式写,所以我们将其强转为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;
}