c++ 基础学习(二)—— IO 对象
1. IO 类
c++ 语言不能直接处理输入输出,而是通过一族定义在标准库中的类型来处理 IO,这些类型支持设备读取数据,向设备写入数据的 IO 的数据操作。
- istream 输入流类型,提供输入操作
- ostream 输出流类型,提供输出操作
- cin 一个 istream 对象,从标准输入读取数据
- cout 一个 ostream 对象
- cerr 一个 ostream 对象,用户输出程序错误消息,写入到标准错误
- >> 运算符,用来从一个 istream 对象读取输入数据
- << 运算符,用来从一个 ostream 对象写入输出数据
- getline 函数,从一个给定的 istream 读取一行数据,存入一个给定的 string 对象中


1.1 IO 对象无拷贝或赋值
ofstream out1, out2;
out1 = out2; //错误
由于不能拷贝 IO 对象,因此我们不能讲形参或返回类型设置为流类型,进行 IO 操作的函数通常以引用方式传递和返回流,读写一个 IO 对象会改变其状态,所以传递和返回的对象引用不能是 const 的。
1.2 管理输出缓冲
我们知道有了缓冲输出,可以使操作系统将多个输出操作组成单一的输出操作,从而对设备的性能带来提高。
那什么时候会刷新缓冲区呢?
- 程序正常结束,缓冲区满了
- 操作符 endl 显示刷新
- unitbuf 操作符
cout << unitbuf; //所有输出操作后会立即刷新缓冲区
cout << nounitbuf; //让程序恢复到正常缓冲策略
1.3 文件输入输出
头文件 fstream 定义了三个类型来支持文件 IO : ①ifstram 从一个给定文件中读取数据,②ofstream 从一个给定文件中写入数据,③fstream 可以读写给定文件。
除了继承自 iostream, fstream 中定义的类型还增新的成员:

1.4 文件模式
- in 读方式打开
- out 写方式打开
- app 写方式打开,但是定位到文件末尾
- ate 打开文件后立即定位到文件末尾
- trunc 截断文件(同 out 类似,写入文件时会清空原有内容)
ofstream out(ifile); //输出模式打开,并且默认清空文件
ofstream out2(ifile, ofstream::out) //隐含截断模式
ofstream out3(ifile, ofstream::out | ofstream::trunc) //显示说明输出模式,并截断模式打开 // 那么如何保留原有内容呢
ofstream out4(ifile, ofstream::app) //隐含输出模式打开,并且定位到文本末尾
ofstream out5(ifile, ofstream::out | ofstream::app)
1.5 string 流
sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据,就像 string 是个 IO 流一样。
- istringstream 从 string 读取数据
- ostringstream 从 string 写入数据
- stringstream 既可以读也可以写(string)数据
头文件 sstream 除了 iostream 头文件中定义的类型之外,还有一些特有的成员来管理与流相关联的 string

1.6 使用 istringstream
当我们的某些工作是对整行文本进行处理,而其他一些工作室处理行内的单个单词时,通常使用 istringstream。
考虑这样一个例子,考虑这样一个例子,假定有一个文件列出了一些人和他们的电话号码。如我们输入的文件看起来可能是这样的:每一行都是一个人的名字+手机号,如何做到读取所有信息并存储呢?

首先,我们通过一个类来描述数据,然后执行读取:
#include<string>
#include<vector>
#include<fstream>
#include<iostream>
#include<sstream>
using namespace std; struct Person {
string name;
vector<string> phones;
}; int main() { string line, word;
vector<Person> people;
ifstream read_file("E:\\Visual Studio Project\\test.txt");
if(!read_file.is_open()){
cout << "open file error" << endl;
} while (getline(read_file, line)) {
Person temp;
//istringstream isrt(string) 构造函数
istringstream record(line); // 因为istringstream继承自istream,可从流中提取数据,可以使用 >> 操作符 record >> temp.name;//输出到name中 while (record >> word) {
temp.phones.push_back(word);
} people.push_back(temp);
} for (auto iter : people) {
cout << iter.name;
for (auto iter2 : iter.phones) {
cout << "\t" << iter2 << endl;
}
} getchar();
return ;
}
运行结果可看:

1.7 使用 ostringstream
当我们逐步构造输出,希望最后一起打印时,ostringstream 非常有用。
c++ 基础学习(二)—— IO 对象的更多相关文章
- Go基础学习(二)
数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
- java基础学习总结六(对象与类、类的属性与方法)
一:面向过程与面向对象的区别 举例:一个人开门的动作,可以分解为开门,人进去,关门. 面向过程:人作为执行者,1:开门 2:进入 3:关门 面向对象:人作为指挥者,将开门,关门的动作都封装到门上 ...
- Django基础学习二
今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...
- 基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式
一.static关键字 1.1.static关键字 静态:static用法:是一个修饰符,用于修饰成员(成员变量,成员函数)static 修饰的内容,所有对象共享当成员被静态修饰后,就多了一个调用方式 ...
- ADO.NET基础学习 二(Command对象)
②command对象用来操作数据库.(三个重要的方法:ExecuteNonQuery(),ExecuteReader(),ExecuteScalar()) ⑴以update(改数据)为例,用到Exec ...
- salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型
看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- Java基础学习总结--Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换成字节序列的过程称之为对象的序列化 把字节序列恢复为对象的过程称之为对象的反序列化 对象序列化的主要用途: 1)把对象的字节序列永久的保存到硬盘上,通常放在一个文 ...
随机推荐
- jsp之大文件分段上传、断点续传
1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...
- 开源项目 08 IOC Autofac
using Autofac; using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- linux下递归删除目录下所有exe文件---从删库到跑路篇
linux下递归删除目录下所有exe文件 find . -name '*.exe' -type f -print -exec rm -rf {} \; (1) "." 表示从当前目 ...
- 控制论模型&心流模型&波模型
1.控制论模型 这是对设定的目标,通过多次输入和输出,反馈调节,最终达成目标的方法.广泛运用于自然科学与社会科学中.反馈的周期长短决定了调节精度的大小以及达到目标的速度.反馈结果与目标背离的立即纠正, ...
- python实现:判断某一天是那一年中的第几天
方法1:先判断是否是闰年,然后再利用求和,得出某一天是第几天 # 方法1:low版 def func1(year, month, day): # 分别创建平年,闰年的月份天数列表(注意列表下标从0开始 ...
- 2019 SDN第四次上机作业
作业博客链接:http://edu.cnblogs.com/campus/fzu/fzusdn2019/homework/10017 1. 解压安装OpenDayLight控制器(本次实验统一使用Be ...
- 解决PHP7无法监听9000端口问题/502错误解决办法
问题背景 昨晚帮配置nginx+php服务的时候,发生了一个奇怪的事情netstat -anp|grep 9000查看9000端口,一直没有监听,于是nginx无法通过fastcgi来代理php请求. ...
- Mybatis(下)
Mybatis(下) 一.MaBatis核心配置文件 Mybatis 中文文档 Mybatis 中文文档 1. properties 定义属性及读取属性文件,取的时候用 $(name) ,name 为 ...
- 开启Nginx监控 with-http_stub_status_module
1.开启监控with-http_stub_status_module ./configure --with-openssl=/usr/local/ssl --with-http_stub_stat ...
- 001 okhttp3的POST使用
继续使用上面的项目 1.被调用的项目 package com.jun.web2forokhttp.okhttp; import com.jun.web2forokhttp.bean.HttpDomai ...