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)把对象的字节序列永久的保存到硬盘上,通常放在一个文 ...
随机推荐
- mariadb(mysql)[详解]
本文链接:https://blog.csdn.net/root__oo7/article/details/82817501 安装: [root@bogon ~]# yum install mariad ...
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
- 函数(定义、参数、return、变量、作用域、预解析)
一.函数定义 1.方式一 function 函数名(参数){ 函数体 }——————函数声明的方法 function fn(a){ console.log(a); }: 2.方式二 ...
- (4.1)打造简单OS-小实验[图形显示]
主要是实现<简单打造OS>第四小节说到的一个图形界面的实验项目 1.mbr boot.inc ;------------- loader和kernel ---------- LOADER_ ...
- 第12组 Alpha冲刺(5/6)
Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...
- 数据结构---公交线路提示系统(Java后台+excel表格+web前端)
系统大致流程: index.jsp输入站名(点击“出示站点信息”,跳转list.jsp读取表格):后台通过站名获得id:getIdbyname(String name)将id反馈至dijkstra( ...
- PostgreSQL递归查询示例
PostgreSQL提供了WITH语句,允许你构造用于查询的辅助语句.这些语句通常称为公共表表达式或cte.cte类似于只在查询执行期间存在的临时表. 递归查询是指递归CTE的查询.递归查询在很多情况 ...
- Mxnet:以全连接层为例子自定义新的操作(层)
https://blog.csdn.net/a350203223/article/details/77449630 在使用深度学习平台时,光会使用其中已定义好的操作有时候是满足不了实际使用的,一般需要 ...
- vue的mixin简化开发
vue的mixin可以将多个组件公用的声明周期方法和数据封装成一个对象,在不同的组件中自由插拔.实际做项目的时候,可以定义一些mixin,供多个组件使用.也非常有必要定义一个全局的mixin对象,对所 ...
- 伟程君解决端口被占用问题(接口jmeter 本地端口被占用完了,jmeter报错的问题)(亲测是可以的)
1.在目录下创建文件local.conf(没有就创建目录和文件) touch /etc/sysctl.d/local.conf mkdir(创建文件夹) touch(创建文件) 2.往local.co ...