C++相关闲碎记录(17)

1、IO操作

(1)class及其层次体系

 (2)全局性stream对象

 (3)用来处理stream状态的成员函数

 前四个成员函数可以设置stream状态并返回一个bool值,注意fail()返回是failbit或者badbit两者中是否任一个设置,如果调用不带参数的clear(),所有的error flag均会被清除。

 下面这个例子用于检查failbit是否设置,若设置则清除。

if(strm.rdstate() & std::ios::failbit){std::cout << "failbit was set" << std::endl;strm.clear(strm.rdstate() & ~std::ios::failbit);
}
(4)stream异常

下面的例子要求所stream对所有的flag均抛出异常:

strm.exceptions(std::ios::eofbit | std::ios::failbit | std::ios::badbit);

但是如果传入0或者goodbit,就不会引发异常。

strm.exceptions(std::ios::goodbit);

 异常抛出的时机是在“程序调用clear()或setstate()之后”又设置了某些flag之际,如果某个标志已被设置但未被清除,也会抛出异常。

下面的例子从输入中读取浮点数,直到end-of-file为止,返回总和。

#include <iostream>
#include <exception>
#include <cstdlib>namespace MyLib {double readAndProcessSum (std::istream&);
}int main()
{using namespace std;double sum;try {sum = MyLib::readAndProcessSum(cin);}catch (const ios::failure& error) {cerr << "I/O exception: " << error.what() << endl;return EXIT_FAILURE;}catch (const exception& error) {cerr << "standard exception: " << error.what() << endl;return EXIT_FAILURE;}catch (...) {cerr << "unknown exception" << endl;return EXIT_FAILURE;}// print sumcout << "sum: " << sum << endl;
}#include <istream>namespace MyLib {double readAndProcessSum (std::istream& strm){using std::ios;double value, sum;// save current state of exception flagsios::iostate oldExceptions = strm.exceptions();// let failbit and badbit throw exceptions// - NOTE: failbit is also set at end-of-filestrm.exceptions (ios::failbit | ios::badbit);try {// while stream is OK// - read value and add it to sumsum = 0;while (strm >> value) {sum += value;}}catch (...) {// if exception not caused by end-of-file// - restore old state of exception flags// - rethrow exceptionif (!strm.eof()) {strm.exceptions(oldExceptions);  // restore exception flagsthrow;                           // rethrow}}// restore old state of exception flagsstrm.exceptions (oldExceptions);// return sumreturn sum;}
}
(5)读写字符的成员函数

 (6)输出控制manipulator

 (7)用户自定义操控器
#include <istream>
#include <limits>template <typename charT, typename traits>
inline
std::basic_istream<charT,traits>&
ignoreLine (std::basic_istream<charT,traits>& strm)
{// skip until end-of-linestrm.ignore(std::numeric_limits<std::streamsize>::max(),strm.widen('\n'));// return stream for concatenationreturn strm;
}

这个控制器用来忽略一行,如果要忽略多行,就调用多次

std::cin >> ignoreLine >> ignoreLine;

函数ignore(max, c)会略去input stream中的字符c之前的所有字符,如果前面的字符多余max个,就略去max个,如果先遇到stream结尾,就全部忽略。

#include <iostream>
#include "ignore1.hpp"int main()
{int i;std::cout << "read int and ignore rest of the line" << std::endl;std::cin >> i;// ignore the rest of the linestd::cin >> ignoreLine;std::cout << "int: " << i << std::endl;std::cout << "read int and ignore two lines" << std::endl;std::cin >> i;// ignore two linesstd::cin >> ignoreLine >> ignoreLine;std::cout << "int: " << i << std::endl;
}
#include <istream>
#include <limits>class ignoreLine
{private:int num;public:explicit ignoreLine (int n=1) : num(n) {}template <typename charT, typename traits>friend std::basic_istream<charT,traits>&operator>> (std::basic_istream<charT,traits>& strm,const ignoreLine& ign){// skip until end-of-line num timesfor (int i=0; i<ign.num; ++i) {strm.ignore(std::numeric_limits<std::streamsize>::max(),strm.widen('\n'));}// return stream for concatenationreturn strm;}
};
#include <iostream>
#include "ignore2.hpp"int main()
{int i;std::cout << "read int and ignore rest of the line" << std::endl;std::cin >> i;// ignore the rest of the linestd::cin >> ignoreLine();std::cout << "int: " << i << std::endl;std::cout << "read int and ignore two lines" << std::endl;std::cin >> i;// ignore two linesstd::cin >> ignoreLine(2);std::cout << "int: " << i << std::endl;std::cout << "read int: " << std::endl;std::cin >> i;std::cout << "int: " << i << std::endl;
}
(8)format flag格式标志

//set flags showpos and uppercase
std::cout.setf(std::ios::showpos | std::ios::uppercase);
//set only the flag hex in the group basefield
std::cout.setf(std::ios::hex, std::ios::basefield);
//clear the flag uppercase
std::cout.unsetf(std::ios::uppercase);
using std::ios;
using std::cout;
//save current format flags
ios::fmtflags oldFlags = cout.flags();//do some changes
cout.setf(ios::showpos | ios::showbase | ios::uppercase);
cout.setf(ios::internal, ios::adjustfield);
cout << std::hex << x << std::endl;
cout.flags(oldFlags);

 (9)文件读写

 (10)文件flag

//seek to the beginning of the file
file.seek(0, std::ios::beg);
//seek 20 characters forward
file.seek(20, std::ios::cur);
//seek 10 characters before the end
file.seek(-10, std::ios::end);
(11)重定向
#include <iostream>
#include <fstream>
#include <memory>
using namespace std;void redirect(ostream&);int main()
{cout << "the first row" << endl; //输出控制台redirect(cout);  //重定向到文件中,执行完毕之后,又重新指向控制台cout << "the last row" << endl;//指向控制台
}void redirect (ostream& strm)
{// save output buffer of the stream// - use unique pointer with deleter that ensures to restore//     the original output buffer at the end of the function// 定义了一个删除器auto del = [&](streambuf* p) {strm.rdbuf(p);};// 使用智能指针的目的时在退出函数时,还原ostreamunique_ptr<streambuf,decltype(del)> origBuffer(strm.rdbuf(),del);// redirect ouput into the file redirect.txtofstream file("redirect.txt");// strm指向file缓冲区strm.rdbuf (file.rdbuf());// 此两字符都会写入到文件中file << "one row for the file" << endl;strm << "one row for the stream" << endl;// 程序结束时,调用智能指针的删除器,将输出重新指向p,而这个p就是strm.rdbuf()
} //
(12)可读写的stream

定义一个file stream缓冲区,并将它安装在两个stream对象上,

std::filebuf buffer;
std::ostream out(&buffer);
std::istream in(&buffer);
buffer.open("example.txt", std::ios::in | std::ios::out);
#include <iostream>
#include <fstream>
using namespace std;int main()
{// open file "example.dat" for reading and writingfilebuf buffer;ostream output(&buffer);istream input(&buffer);buffer.open ("example.dat", ios::in | ios::out | ios::trunc);for (int i=1; i<=4; i++) {// write one lineoutput << i << ". line" << endl;// print all file contentsinput.seekg(0);          // seek to the beginningchar c;while (input.get(c)) {cout.put(c);}cout << endl;input.clear();           // clear  eofbit and  failbit}
}
输出:
1. line1. line
2. line1. line
2. line
3. line1. line
2. line
3. line
4. line
(13)stream 缓冲区接口

 函数pubseekoff()和pubseekpos()控制读写动作的当前位置,究竟是控制读或者写,取决于最后实参,其类型为ios_base::openmode,如果没有特别指定,实参默认值为ios_base::in|ios_base::out,一旦设置ios_base::in,读的位置就会跟着改变,一旦设置ios_base::out,写的位置也会跟着变化,函数pubseekpos()会把stream当前位置移至第一实参指示的绝对位置上,函数pubseekoff()则把stream当前位置移至某个相对位置,偏移量由第一实参决定,起始位置由第二实参决定,可以是ios_base::cur, ios_base::beg, ios_base::end。两个函数都返回stream所在的位置或者一个无效的位置,将函数的结果拿来和对象pos_type(off_type(-1))比较(pos_type和off_type是处理stream位置时所用的类型),如果希望获取stream当前位置,可以使用pubseekoff(): sbuf.pubseekoff(0, std::ios:cur)。

(14)output stream 缓冲区的iterator

使用ostreambuf_iterator将一个字符串写入stream缓冲区内:

std::ostreambuf_iterator<char> bufWriter(std::cout);
std::string hello("hello, world\n");
std::copy(hello.begin(), hello.end(), bufWriter);

 (15)input stream 缓冲区的iterator

 将输入缓冲区的字符输出:

#include <iostream>
#include <iterator>
using namespace std;int main()
{// input stream buffer iterator for cinistreambuf_iterator<char> inpos(cin);// end-of-stream iteratoristreambuf_iterator<char> endpos;// output stream buffer iterator for coutostreambuf_iterator<char> outpos(cout);// while input iterator is validwhile (inpos != endpos) {*outpos = *inpos;    // assign its value to the output iterator++inpos;++outpos;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【重点】【DP】152.乘积最大的子数组

题目 法1&#xff1a;DP 参考&#xff1a;https://blog.csdn.net/Innocence02/article/details/128326633 f[i]表示以i结尾的连续子数组的最大乘积&#xff0c;d[i]表示以i结尾的连续子数组的最小乘积 。 如果只有正数&#xff0c;我们只需要考虑最大乘积f[i]&#xff1b;有负…

MATLAB - Gazebo 仿真环境

系列文章目录 前言 机器人系统工具箱&#xff08;Robotics System Toolbox™&#xff09;为使用 Gazebo 模拟器可视化的模拟环境提供了一个界面。通过 Gazebo&#xff0c;您可以在真实模拟的物理场景中使用机器人进行测试和实验&#xff0c;并获得高质量的图形。 Gazebo 可在…

c# OpenCV 基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)

我们将在这里演示如何使用几何形状和文本注释图像。 Cv2.Line() 绘制直线 Cv2.Ellipse() 绘制椭圆Cv2.Rectangle() 绘制矩形Cv2.Circle() 绘制圆Cv2.FillPoly() 绘制多边形Cv2.PutText() 绘制文本 一、绘制直线 Cv2.Line(image, start_point, end_point, color, thickness) …

从传统型数据库到非关系型数据库

一 什么是数据库 数据库顾名思义保存数据的仓库&#xff0c;其本质是一个具有数据存储功能的复杂系统软件&#xff0c;数据库最终把数据保存在计算机硬盘&#xff0c;但数据库并不是直接读写数据在硬盘&#xff0c;而是中间隔了一层操作系统&#xff0c;通过文件系统把数据保存…

2023ChatGPT浪潮,2024开源大语言模型会成王者?

《2023ChatGPT浪潮&#xff0c;2024开源大语言模型会成王者&#xff1f;》 一、2023年的回顾 1.1、背景 我们正迈向2023年的终点&#xff0c;回首这一年&#xff0c;技术行业的发展如同车轮滚滚。尽管互联网行业在最近几天基本上处于冬天&#xff0c;但在这一年间我们仍然经…

递归经典三题

目录1.斐波那契数列&#xff1a; 2.青蛙跳台阶问题&#xff1a; 3.汉诺塔问题 1.斐波那契数列&#xff1a; 由斐波那契数列从第三项开始&#xff0c;每一项等于前两项之和&#xff0c;可以使用递归计算给定整数的斐波那契数。 1&#xff0c;1&#xff0c;2&#xff0c;3&am…

酒水品牌网站建设的效果如何

酒是人们餐桌常常出现的饮品&#xff0c;市场中的大小酒品牌或经销商数量非常多&#xff0c;国内国外都有着巨大市场&#xff0c;酒讲究的是品质与品牌&#xff0c;信息发展迅速的时代&#xff0c;商家们都希望通过多种方式获得生意增长。 酒商非常注重品牌&#xff0c;消费者也…

为什么要编写测试用例,测试用例写给谁看?

“为什么要编写测试用例&#xff0c;测试用例写给谁看”&#xff0c;这个问题看似简单&#xff0c;但却涵盖了一系列复杂的考虑因素&#xff0c;并不太好回答。 为了向各位学测试的同学们解释清楚“为什么编写测试用例是至关重要的”&#xff0c;我将通过以下5个方面进行展开&…

EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(二)EEMD

往期精彩内容&#xff1a; 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff08;三&#xff09;EMD-LSTM-Attention模型-CSDN博客 风速预测&#xff08;四&#xf…

鸿蒙 - arkTs:渲染(循环 - ForEach,判断 - if)

ForEach循环渲染&#xff1a; 参数&#xff1a; 要循环遍历的数组&#xff0c;Array类型遍历的回调方法&#xff0c;Function类型为每一项生成唯一标识符的方法&#xff0c;有默认生成方法&#xff0c;非必传 使用示例&#xff1a; interface Item {name: String,price: N…

作物模型中引入灌溉参数

在没有设置灌溉时,土壤水分模拟结果如下找到了PCSE包中田间管理文件的标准写法 在agromanager.py中有详细的信息(如何设置灌溉以及施肥量) Version: 1.0 AgroManagement: - 2022-10-15:CropCalendar:crop_name: sugar-beetvariety_name:

HarmonyOS ArkTS 中DatePicker先择时间 路由跳转并传值到其它页

效果 代码 代码里有TextTimerController 这一种例用方法较怪&#xff0c;Text ,Button Datepicker 的使用。 import router from ohos.router’则是引入路由模块。 import router from ohos.router Entry Component struct TextnewClock {textTimerController: TextTimerContr…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜E

老老规矩&#xff0c;看目录&#xff0c;平均每年2E&#xff0c;跟2D一样&#xff0c;D是全对&#xff0c;E是全错&#xff0c;侧面也看出10道题&#xff0c;大概是3A/B&#xff0c;3C&#xff0c;2D&#xff0c;2E&#xff0c;其实还是蛮平均的。但E为1道的情况居多。 第20题…

Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系“xxx_xx_xx_seq“不存在

场景 Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入&#xff1a; Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入-CSDN博客 上面讲使用pg_dump进行postgresql的导出与导入。 如果使用Navicat可以直接连接两个库&#xff0c;则可直接使…

材料论文阅读/中文记录:Scaling deep learning for materials discovery

Merchant A, Batzner S, Schoenholz S S, et al. Scaling deep learning for materials discovery[J]. Nature, 2023: 1-6. 文章目录 摘要引言生成和过滤概述GNoME主动学习缩放法则和泛化 发现稳定晶体通过实验匹配和 r 2 S C A N r^2SCAN r2SCAN 进行验证有趣的组合家族 扩大…

通用的java中部分方式实现List<自定义对象>转为List<Map>

自定义类 /*** date 2023/12/19 11:20*/ public class Person {private String name;private String sex;public Person() {}public Person(String name, String sex) {this.name name;this.sex sex;}public String getName() {return name;}public String getSex() {return…

鸿蒙Harmony4.0开发-ArkTS基础知识运用

概念 1.渲染控制语法&#xff1a; 条件渲染&#xff1a;使用if/else进行条件渲染。 Column() {if (this.count > 0) {Text(count is positive)} }循环渲染&#xff1a;开发框架提供循环渲染&#xff08;ForEach组件&#xff09;来迭代数组&#xff0c;并为每个数组项创建…

2023人物专访「中国新时代艺坛楷模」蓝弘艺术专题报道

蓝弘&#xff0c;名文珺&#xff0c;广东客家人。十六届人大代表&#xff0c;广州蓝弘艺术中心创办人&#xff0c;民建中央画院广东分院副院长&#xff0c;广东省美术家协会会员&#xff0c;广州江海地区书画家协会会长。 蓝弘画家被世界教科组织联合协会评为“世界艺术大使”…

【操作系统】快速做题向 优先权调度(抢占式/非抢占式)算法做题步骤分析

理论知识理解上面这几句话就行。 抢占&#xff0c;非抢占的区别就是&#xff0c;能不能直接中断某正在进行的优先级没我高的进程的运行。 非抢占只要某进程已经在运行了&#xff0c;后面不论出现多少优先级多高的进程&#xff0c;都得老老实实等待这个进程运行完毕&#xff0…