C++复习day9:输入输出与新特性(依据C++premier plus)

基于《C++premier plus》第17、18章学习整理:

第十七章 输入、输出和文件

一、概述
1.程序通过绑定流与两端,只需要检查字节流,对其流动方式不再需要管理。(以输入流为例)实现步骤为:将流与输入去向的程序关联起来/将流与文件连接起来
2.缓冲区规则:
(1)输入时:用数据块填充缓冲区——>流逐字节地进入程序——>用下一个数据块填满缓冲区
(2)输出时:程序填满缓冲区,把整块数据传输给硬盘,清空缓冲区,以备下一批输出使用。
3.刷新时间:
(1)按下回车键刷新输入缓冲区
(2)发出换行符或当程序到达输入语句时刷新输出缓冲区
4.所使用的i/o其实是一套模板的char或wchar_t具体化的typedef
5.当程序包含iostream文件时将自动创建8个流对象(四个用于窄字符流,四个w前缀的用于宽字符流):
cin即标准输入流/cout即标准输出流/cerr即标准错误流/clog也是标准错误流
6.流相关有streambuf对象存储显示数据的信息帮助cout对象管理流中字节流
7.操作系统命令行实现重定向<不会影响错误流,需要重定向错误流请参考具体操作系统操作>:如有程序counter.exe则形如counter <oklahoma >cow_cnt表示将oklahoma内容投入程序中并将其中cout内容导入cow_cnt
 
二、使用cout进行输出
1.ostream类将数据内部表示转换成由字符和字节组成的输出流,并重新定义了<<使流可以识别任何的基本类型
2.对char*指向的c-风格字符串根据其空字符的位置进行截断;对void*指向的数据块打印其内存地址
3.由于返回值是流类型的引用(即本身)所以可以使用拼接的输出方式
4.其他方法:
(1)cout.put()的意义是自动将参数转换成字符的正确形式,哪怕是一个float值
(2)cout.write(内存块,打印长度(字节数))根据内存块二进制内容和指定类型及长度(即便遇到空字符或者超界也不会停止打印)进行打印,常用于文件当中(后述)
5.强制刷新:cout<<flush;或flush(cout);
6.格式化:显示的方式和其在内存中的表现形式大多时候都不相同(甚至无关联)
基类ios::base和iomanip中定义的格式状态方法和控制符用于格式化:具体列表 https://www.cnblogs.com/huashanqingzhu/p/3544797.html
(1)ios_base::showpoint 显示小数点,在默认浮点显示方式当中也会将后面的0进行显示
(2)科学表示法和定点表示法都具备:<a>精度是小数位数而不是总位数<b>显示末尾的0
(3)格式恢复可以使用返回的旧格式记录或unsetf消除
 
三、使用cin进行输入
1.拼接、识别范围都和cout输出具备类似的特性
2.>>抽取运算符的输入特性:跳过空白(空格、换行符、制表符)/匹配输入目标对象,取符合的流内容直到遇到不匹配项/如果没有成功取得任何则返回 false
3.流状态:三个ios_base元素描述流状态
(1)eofbit表示到达文件末尾/failbit表示未能获取字符和io失败/badbit表示出现无法诊断的失败破坏流(流状态位将对后面的输入输出关闭直到位被清除)
(2)clear()和setstate()方法设置状态,其中clear除了设置位会将其他项清0,而setstate不会影响设置目标以外的项(clear常用于重置流状态)
(3)流状态改变不会直接造成异常,设置其形如cin.exceptions(badbit|failbit)实现当这些位表示为是时进行异常处理。
(4)cin有good、bad、fail、eof等方法辅助进行流相关状态判断
(5)流状态处理
if (cin.fail() && !cin.eof())
{
    cin.clear();
    while (cin.get() != '\n')
        continue;
}
4.单字符输入
(1)get(char& ch)将输入字符赋给其指定参数
(2)int ch=cin.get()返回输入字符的int表示,可以判断==EOF
5.输入方式选择:希望跳过空白则选择>>.需要检查每一个字符则需要使用get方法
6.字符串输入
(1)istream & get(char*,int x[,char w]);
(2)istream & getline(char*,int x[,char w]);
取一行(至多x个数)或者遇到哨兵符号为止并将内容给数组。get会将换行符留在流中而getline会将其抛弃
(3)ignore方法抛弃n个字符或直到遇到哨兵符号
(4)意外输入:get输入空行会报错;getline读取的下一个不是换行符时报错
7.其他方法
(1)read():读取指定数目字节并存在指定位置,但不会在输入后加上空值字符
(2)peek():返回下一个字符但不将其抽取
(3)gcount():返回最后一次非格式化(即非 >>)抽取的字符数量
(4)putback():将一个字符插入到输入字符串中
 
四、文件的输入输出
1.流程(以输入为例):
(1)创建流对象:ifstream fin;
(2)关联流与文件:fin.open("test.txt")l
(3)对流进行与标准输入输出一致的读写操作:<<,>>,write,read,getline,get等
(4)关闭连接:fin.close();
前两步可合并成ifstream fin("text.txt");
2.创建的流会有独立的缓冲区
3.关闭连接不是删除流而是断开了流与文件的关联,可以重新关联或和其他文件关联/重新关联使用一下clear()是无害的
4.fin.is_open()常用于检测文件是否正常打开
5.main函数可以增加参数(int argc,char * argv[]);argc表示命令行调用该程序时字段总数,argv则是字串组(字段包含程序名本身)
6.将流与文件进行关联时可以指定第二个参数表示文件模式(包含追加、读写、清空、二进制等方式)
7.二进制方式配合write与read方法可以实现对结构体及基本数据的保存和还原,含指针嵌套指针成员的不可保存(含虚函数的类对象无法保存,一般类对象按语义可以保存< 还未进行测试(容器对象是否可以保存)>)
8.随机存取:
(1)seekg():将输入指针移动到指定文件位置
(2)seekp():将输出指针移动到指定文件位置
移动可以以当前位置<tellg()/tellp()方法可获取>、开头、结尾为参照物并设置偏移量
9.使用临时文件:通过常量L_tmpnam控制文件名长度限制TMP_MAX控制允许生成的总个数;在调用tmpnam(pazName)生成文件名并放入数组pazName当中
 
五、内核格式化:读取string对象的格式化信息或将格式化信息写入string对象称为内核格式化
看起来像是将字串作为流源的流,且该流可以使用流方法格式化再与字串自由转换,实现对字串的格式化。
 
 

第十八章 探讨c++新标准

一、一些改进
1.新类型:引入long long/unsigned long long
2.统一初始化:可以使用{}初始化任何类型,且可省略=
(1)使用{}也即初始化列表语法时,禁止将数值赋给无法存储它的变量
(2)可以模板类initializer_list作为构造类参数,此时涉及初始化列表的初始化就只可以有该函数进行
3.简化声明的机制:
(1)auto x=std::valarray<double> val;使变量自动匹配初始化内容类型
(2)decltype (x*n) y;使变量自动匹配表达式结果类型
(3)后置返回值类型:auto eff(T t,U u) -> decltype(t*u)主要用于模板函数的返回值
(4)可用于具体化的模板别名:using arr12=std::array<T,12>;
(5)nullptr新的不会指向有效数据的指针也即空指针
4.智能指针的引入
5.指出可能的异常的错误规范throw()及保证不会出现异常的noexception
6.作用域内枚举命名冲突解决:使用enum class/struct New{枚举常量};也即在声明中加入关键词struct或class即可在重名时通过唯一的枚举类命名进行作用域符进行选取
7.类的修改
(1)explicit关键字在可以禁止单参数构造函数造成的转换的基础上可以对类型转换函数做类似的处理
(2)允许在类声明中对成员进行初始化:实质上相当于将这些初始化添加到每一个构造函数的参数初始化列表当中(会被构造函数定义覆盖),简化了重复的构造函数编写
8.模板和STL方面修改
(1)基于范围的for循环,且可以在参数元素中选择使用auto和&简化编程
(2)新增单量列表,四种哈希容器和模板array
(3)新增STL方法,包含后面的移动语义以及cend()/cbegin()/crend()/crbegin()返回const的迭代器
(4)valarray类对象开始适用于部分STL方法
(5)放弃了用于将声明和实现模板分离的关键字export,但继续留用
(6)c++不再要求模板嵌套的<>尖括号中间加入空格来区分运算符>>
9.右值引用:形如int && a=10;获取10所在无名引用并赋给a,可直接a=100得对地址内容进行修改
 
二、移动语义和右值引用
1.意义:复制副本再进行逐项赋予指定变量再清除副本的过程对大型目标来说过于浪费,将副本本身所有权进行变更更符合要求
2.方式:建立移动构造函数(类包含数据int n、char* pc)
Useless ::Useless(Useless && f):n(f.n)
{
    pc=f.pc;
    f.pc=nullptr;
    f.n=0;
}0
0
让pc指向现有数据(副本),并将副本原指向联系切断(防止析构出问题),要修改f所以不能设为const。
编译器根据初始化所使用的表达式类型决定调用方法,如four(one+three)使用的是one+three这个右值,而two=one使用的是one这个左值
3.移动语义还适用于重载=运算符的方法中
4.强制移动:用如one=std::move(two);可强制将two看做右值,two就空了,one具备了tow的属性
 
三、新类功能
1.在默认构造方法、复制构造方法、复制赋值运算符和析构函数基础上增加了移动构造函数和移动赋值运算符
2.显式创建默认函数:Someclass()=default;
3.禁止使用成员函数:Someclass()=delete;也可以用于禁止特定转换 
4.委托构造函数:可以在构造函数参数初始化列表当中使用其他构造函数简化编写
5.继承构造函数:可以使用using A:fn;获得基类函数使用权,c++11允许使用该方法继承基类构造函数,当初始化与子类方法无法匹配时会去寻找继承来的基类方法对基类成员进行初始化
6.虚方法管理:虚方法声明后面追加 const final表示该方法不接受派生类重写,const override表示我正在覆盖基类虚方法,此时当出现逻辑问题将得到异常提示。
 
四、lambda函数
1.常用于替代在方法中需要函数指针或函数符的情况
2.仅当lambda语句只包含一个返回语句时自动推断返回值的功能时生效的,否则需要使用返回值后置格式,形如
[](double x)->double{int y=x;return x-y;}
3.可以给lambda函数命名如auto(这里也是以是bool)met1=[](double x)->double{int y=x;return x-y;}
4.额外功能,lambda可以在[]中捕获作用域内的动态变量使用,如[z],当要使用引用时则[&z],也可以调用多个,形如[&count,z]
 
五、包装器wrapper(也叫适配器adapter)
1.概述
(1)bind可替代bind1st和bind2rd且更灵活(将二参函数包装为可以投入一个参数的函数)
(2)mem_fn将成员函数作为成年高贵函数进行处理
(3)reference_wrapper创建行为像引用但可被复制的对象
(4)function统一处理多种类似于函数的形式
2.function:位于头文件<functional>
(1)使用单纯的函数模板过于低效,因为一其方法预留类型位置一旦参数类型不同(不同的类型函数符一定类型不同,返回值不同也会不同)就会重新实例化一个函数
(2)function将方法根据需要参数类型和返回类型进行归类,形如std::function<double(char,int)> fdci;则可以将任何投入char,in产出doble的类似函数的形式赋给他
(3)用该包装器进行包装防止模板类的重复实例化
(4)两种更好地表示方法:
    <1>声明一个包装器变量typedef function<double(double)> fdd;use_f(y,fdd(dub));即可优化使用函数符dub
    <2>在模板中将参数声明为function包装器对象T use_f(T v,std::function<T(T)> f)即可
 
六、可变参数模板:在模板中声明不确定长度的参数
template<typename T>//递归中止的出口模板 
void show_list(const T& value)
{
    std::cout<<value<<'\n';
}
template<typename T,typename... Args>//使用递归实现可变参数模板
void show_list(const T& value,const Args&... args)//也可以用Args...,const Args&...表示使用引用的模式,更高效
{
    std::cout<<value<<',';
    show_list(args...)//展开参数,使用递归
}
 
七、一些新功能
1.并行编程:原子操作库头文件<atomic>,线程支持库头文件<thread>/<mutex>/<condition_variable>/<future>
2.新增的库:
(1)<random>各种分布的随机数工具
(2)<chrono>提供处理时间间隔的途径
(3)<tuple>存储任意多个类型不同的值
(4)<ratio>精确计算与精确表达有理数
(5)<regex>支持正则表达式
3.低级编程
(1)允许共有体成员有构造和析构
(2)alignsof方法对齐存储的方式
4.杂项
(1)调试工具assert对断言进行检查
(2)加强了元编程支持
 
八、语言变化
1.Boost项目:在开放论坛组织的免费发布库项目
使用如#include "boost/lexical_cast.hpp"的语句拉取boost项目
(1)lexical_cast数值和类型间简单转换
(2)Any库在容器中存储不同类型
(3)Math增加数学函数
+
(4)Filesystem编写的代码在不同文件系统移植
2.TR1:库的扩展选集
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值