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 731. My Calendar II
原题链接在这里:https://leetcode.com/problems/my-calendar-ii/ 题目: Implement a MyCalendarTwo class to store y ...
- S1_搭建分布式OpenStack集群_12 界面horizon安装
一.界面的安装控制节点安装软件包:# yum install openstack-dashboard -y 修改配置文件:# vim /etc/openstack-dashboard/local_se ...
- CLR 调试体系结构
公共语言运行时 (CLR) 调试 API 专门用作操作系统内核的一部分. 在非托管代码中,当程序生成异常时,内核将暂停执行进程,并使用 Win32 调试 API 将异常信息传递给调试器. CLR 调试 ...
- circus && web comsole docker-compose 独立部署
问题的根本原因是web console 的bug(实际上还是python 对于依赖版本出来不明确) circus 进程docker 镜像 dockerfile FROM python:slim-str ...
- C# 监测每个方法的执行次数和占用时间(测试4)
今天也要做这个功能,就百度一下,结果搜索到了自己的文章.一开始还没注意,当看到里面的一个注释的方法时,一开始还以为自己复制错了代码,结果仔细一看网页的文章,我去,原来是自己写的,写的确实不咋地. 把自 ...
- 机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)
在<机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)>一文中,我们讨论了如何用逻辑回归解决二分类问题以及逻辑回归算法的本质.现在 ...
- 【JOISC2019|2019】【20190622】cake3
题目 \(N\) 个物品中选\(M\)个,排列成一个环:\(k_1,\cdots,k_M\)价值为: \[ \sum_{j=1}^{N}{V_i} - \sum_{j=1}^{M}|C_{k_j}- ...
- [转]gulp排除已压缩文件思路
文章转载至[gulp排除已压缩文件思路] gulp默认排除语法的弊端 有个时候我们需要时用gulp排除已经压缩过的js,css等.如果以压缩文件是以".min.js"之类命名规范的 ...
- 【BZOJ4475】 [Jsoi2015]子集选取
题目描述 数据范围 \(1\leq N,K \leq 10^9\) \(solution\) 集合S中每个元素互不影响,不妨依次考虑其中一个元素在三角形中的出现情况 问题转化为一个\(0/1\)的三角 ...
- Mac查看进程
Last login: Tue Jun 11 11:18:10 on ttys001 liangyufengdeMacBook-Pro:vod-admin liangyufeng$ lsof -i:6 ...