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)把对象的字节序列永久的保存到硬盘上,通常放在一个文 ...
随机推荐
- LeetCode 1061. Lexicographically Smallest Equivalent String
原题链接在这里:https://leetcode.com/problems/lexicographically-smallest-equivalent-string/ 题目: Given string ...
- WinDbg常用命令系列---||(系统状态)
||(系统状态) 简介 双竖线 ( || ) 命令将打印指定的系统或当前正在调试的所有系统的状态. 使用形式 || System 参数 System 指定要显示的系统. 如果省略此参数,将显示正在调试 ...
- 洛谷P1265 公路修建题解
题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一轮中,每个城市选择一个 ...
- Beta冲刺(5/5)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 验收了小程序的主要功能 制作Beta展示所需要用到的视频 制作Beta展示PPT 准备Beta答辩 提交记录(全组共用) ...
- 【POJ2632】Crashing Robots
题目传送门 本题知识点:模拟 模拟机器人的运作过程,分别有三种功能,L 则是左转90°,R 则是右转90°,L 则是前进1格.让我们去模拟并判断它们的状态. 输入: 第一行是测试样例 第二行分别是矩形 ...
- MATLAB 可以画的各种类型的图总结
MATLAB® 提供了各种可用来绘制数据图的函数.下表对常见的图形函数进行了分类和说明. 线图 数据分布图 离散数据图 极坐标图 等高线图 向量场 plot area stairs polarplot ...
- rancher2.x的安装
docker run -d --restart=unless-stopped \-p 80:80 -p 443:443 \-v /var/lib/rancher:/var/lib/rancher/ ...
- MySQL Group By 实例讲解(二)
mysql group by使用方法实例讲解 MySQL中GROUP BY语句用于对某个或某些字段查询分组,并返回这个字段重复记录的第一条,也就是每个小组(无排序)里面的第一条. 本文章通过实例向大家 ...
- ukulele弹奏模拟器v1.0(待完善)
写在前面 最近听beyond乐队的<灰色轨迹>听上瘾了,300多遍,震惊!!尤其喜欢最后一分半钟的吉他solo,真可谓吉他没有酒,依然让我醉如老狗.. 翻了翻网上的视频,瞬间觉得单身20年 ...
- 2019年10~11月-NLP工程师求职记录
求职目标:NLP工程师 为什么想换工作? 除了技术相关书籍,我没读过太多其他类型的书,其中有一本内容短但是对我影响特别大的书--<谁动了我的奶酪>.出门问问是我毕业后的第一份工作,无论是工 ...