1:为了支持使用宽字符的语言,标准库定义了一组类型和对象来操作wchar_t类型的数据。宽字符版本的类型和函数的名字以w开头。宽字符版本和普通的char版本定义在同一个头文件中,例如头文件fstream定义了ifstreamwifstream

2:标准库能使我们忽略不同类型流之间的差异是通过继承机制实现的。

3:IO对象无拷贝或者赋值。所以我们不能将IO对象作为函数形参或者返回值,一般用引用的形式。又因为读写IO操作会使得对象的状态发生变化,所以一般不会用const类型的。

4:使用IO就伴随着可能发生错误的风险。下面是判断IO对象是否正常的条件状态。

IO 含义
strm::iostate strm是一种IO类型,包括iostream,fstream,sstream等,iostate是一种机器相关的类型?什么叫机器相关?
strm::badbit 指流已经崩溃
strm::failbit 指一个IO操作已经失败了
strm::eofbit 指流到达了文件的末尾
strm::googbit 指流未处于错误状态,此值保证为0
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的failbit或者badbit置位,则返回true
s.good() 若流处于有效状态,则返回ture
s.clear() 将流的所有状态条件复位,将流的状态设置为有效,返回void
s.clear(flags) 根据给定的flags,将流s中对应条件复位,flags的类型为strm::iostate。返回void
s.setstate(flags) 根据给定的flags,将流s中对应条件复位,flags的类型为strm::iostate。返回void
s.rdstate() 返回流的当前状态,返回值类型为strm::iostate

5:unitbuf和nounitbuf
unitbuf:所有输出操作后都会刷新缓冲区
nounitbuf:重置流,使其恢复正常使用的系统管理的缓冲区刷新机制。
需要注意的是:如果程序崩溃,输出缓冲区是一般不会被刷新的。
有关刷新的知识请看下面的例子:

#include<iostream>
#include<thread>
#include<chrono> int main(int argc,char *argv[])
{
int a = 5;
std::cout << a << std::endl; //直接输出a的值,刷新了缓冲
std::cout << a << std::flush; //直接输出a的值,刷新了缓冲
std::cout << a << std::ends; //没有直接输出a的值,程序结束才输出
std::cout << a << std::unitbuf; //没有直接输出a的值,程序结束才输出
std::cout << a << std::nounitbuf;//没有直接输出a的值,程序结束才输出
//下面的代码是让程序sleep两秒。
for(int i = 2;i > 0; --i) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}

6:文件的输入输出
fstream中定义了三个类型来支持文件IO
ifstream:从一个给定文件中读取数据。
ofstream:向一个给定文件中写数据。
fstream:用来读写给定文件。

下面是fstream中的一些特有的操作:

名称 含义
fstream fstrm 创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
fstream fstrm(s) s是文件名,默认打开权限
fstream fstrm(s,mode) 与前一个构造函数类似,但是按照指定的mode打开文件
fstrm.open(s) 打开名为s的文件,并且将文件与fstrm绑定
fstrm.close() 关闭与fstrm绑定的文件
fstrm.is_open() 返回一个bool值,指出与fstrm相关联的文件是否打开且尚未关闭

7:使用c++读写文件
打开文件的几种模式:

模式 含义
in 以读方式打开
out 以写方式打开
app 以追加的方式打开
ate 打开文件后立即定位到文件末尾,即使文件有内容也读不出来
trunc 截断文件
binary 以二进制的方式进行IO
std::ifstream input(filename);  //默认ifstream以in的模式打开文件
std::ofstream output(filename); //默认ofstream以out的模式打开文件
std::fstream fstrm(filename); //默认以in和out的模式打开文件
std::ofstream output(filename,std::ofstream::app) //以追加的方式打开
std::ifstream input(filename,std::ifstream::app) //默认打开文件失败则新建文件。
>> : 相当于cin()函数,由于它已经经过重载,我们可以直接使用,用于读文件。
<< : 相当于print()函数,重新写入文件

下面程序从一个文件读取数据存入另一个文件,文件名通过main函数的参数指定:

#include<iostream>
#include<fstream> using std::cout;
using std::cin;
using std::endl; int main(int argc,char *argv[])
{
std::ifstream input(argv[1]); //假设argv[1]是一个int类型的数据文件
std::ofstream output(argv[2],std::ofstream:;app); //第二个参数的意思是追加数据
if(input) {
int a;
while(input >> a) { //从argv[1]读取一个数据
output << a << " "; //将数据写入argv[2]中。
}
}
return 0; //下面两句是必须的吗?
input.close();
output.close();
}

8:istringstream和ostringstream的用法
istringstream:

#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include<vector> using std::cout;
using std::cin;
using std::endl; struct people {
std::string name;
std::vector<std::string> phones;
}; int main(int argc,char *argv[])
{
std::vector<people> PersonInfo;
std::ifstream input("5.txt");
if(input) {
std::string line,word;
while(std::getline(input,line)) { //input从原文件中读取一行
people pop;
std::istringstream record(line);
//利用istringstream对整个line字符串构造,接下来处理的是读取的整行字符
record >> pop.name;
while(record >> word) {
pop.phones.push_back(word);
}
PersonInfo.push_back(pop);
}
}
std::ofstream output("6.txt");
for(auto u:PersonInfo) {
output << u.name << " ";
for(auto h:u.phones) {
output << h << " ";
}
output << endl;
}
return 0;
}

ostringstream用于当我们逐步构造输出,希望一并打印或者处理的时候比较有用。
对于ostringstram的使用我们可以使用<<运算符,当我们使用其时,就相当于向定义的
ostringstream对象添加字符。

c++ IO库的更多相关文章

  1. [APUE]标准IO库(下)

    一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...

  2. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  3. 文件IO函数和标准IO库的区别

    摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...

  4. 【转载】C++ IO库

    本篇随笔为转载,原贴地址:<C++ Primer>第8章 IO库 学习笔记. 1.IO类 #include <iostream> istream//从流中读取数据 ostrea ...

  5. 从Decorator,Adapter模式看Java的IO库

    我想任何一本介绍模式的书在讲到Decorator模式的时候不能不提到它的实际应用--在Java/IO库里面的应用,<<Java与模式>>这本书也不例外,有点不一样的是,这本书在 ...

  6. C++ Primer 读书笔记: 第8章 标准IO库

    第8章 标准IO库 8.1 面向对象的标准库 1. IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于 ...

  7. 标准模板库——IO库

    IO库设施: . istream(输入流)类型,提供输入操作. . ostream(输出流)类型,提供输出操作. . cin,一个istream对象,从标准输入读取数据. . cout,一个ostre ...

  8. 高级UNIX环境编程5 标准IO库

    标准IO库都围绕流进进行的 <stdio.h><wchar.h> memccpy 一般用汇编写的 ftell/fseek/ftello/fseeko/fgetpos/fsetp ...

  9. IO库

    IO类 C++语言不直接处理出入输出,而是通过一族定义在标准库中的类型来处理IO.这些类型支持从设备读取数据.向设备写入数据的IO操作,设备可以是文件 .控制台窗口 等.还有一些类型允许内存IO ,即 ...

  10. 第 8 章 IO库

    第 8 章 IO库 标签: C++Primer 学习记录 IO库 第 8 章 IO库 8.1 IO类 8.2 文件输入输出 8.1 string流 8.1 IO类 IO对象无拷贝或赋值,因此不能将形参 ...

随机推荐

  1. python多线程与_thread模块

    进程与线程 1.进程:计算机程序只是存储在磁盘中的可执行二进制(或其他类型)的文件.只有把他们加载到内存中并被操作系统调用,才具有其生命周期.进程则是一个执行中的程序.每个进程都拥有自己的地址空间,内 ...

  2. [转载]CentOS 7 用户怎样安装 LNMP(Nginx+PHP+MySQL)

    关于 Nginx (发音 "engine x")这是一款免费.开源.高效的 HTTP 服务器,Nginx是以稳定著称,丰富的功能,结构简单,低资源消耗.本教程演示如何在CentOS ...

  3. bzoj#4722-由乃【倍增,抽屉原理,bitset】

    正题 题目链接:https://darkbzoj.tk/problem/4722 题目大意 给出一个长度为\(n\)的序列值域为\([0,v)\),要求支持操作 询问一个区间能否找到两个没有交的非空下 ...

  4. P7276-送给好友的礼物【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P7276?contestId=39577 题目大意 \(n\)个点的一棵树,\(k\)个关键点,两个人从根出发分别走 ...

  5. P3273-[SCOI2011]棘手的操作【线段树,并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/P3273 题目大意 \(n\)个点有权值,要求支持操作 连接两个点 单点加权 联通块加权 全图加权 单点询问 联通块 ...

  6. Python代码阅读(第8篇):列表元素逻辑判断

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...

  7. LINUX系统入侵排查

    当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解决方案与防范措施,为 ...

  8. 5-基本的sql查询以及函数的使用

    基本SQL查询语句以及函数的使用 格式元素 描述 YYYY 四位的年份 MONTH 月份的英文全称 MON 月份的英文简写 MM 月份的数字表示 DD 日起的1-31数字表示 D 星期几的数字表示1- ...

  9. 重修 Tarjan

    Tarjan是谁 Tarjan's SCCs(有向图强连通分量)algorithm 给定⼀个有向图 \(G\),若存在 \(rt\in V\),满⾜从 \(rt\) 出发能到达 \(V\) 中的所有的 ...

  10. 题解 [HAOI2016]字符合并

    题目传送门 Description 有一个长度为 \(n\) 的 \(01\) 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数. 得到的新字符和分数由这 k 个字符确定.你需要 ...