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.hqwc.cn/news/288205.html

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

相关文章

STM32Fxx HAL库开发UART中断回调函数理解-中断回调函数流程-自己理解的

STM32HAL库中断服务函数调用过程有2种 第1种&#xff1a;可以直接在中断源对应的中断服务函数中编写我们想要的功能 具体是在void USART1_IRQHandler(void&#xff09;函数写要执行的任务 正点原子是重新宏定义函数名&#xff0c;写法如下&#xff1a; 暂时忽略&#xff0c;…

如何通过控制台排查定位EasyTsdb

过去我们发现EasyTsdb占用磁盘较大&#xff0c;但我们却不能直接看到哪个模型占用空间多&#xff1f;更不可能知道是哪个指标数据量大&#xff1f; 当EasyTsdb负载高时&#xff0c;我们无法定位当时哪个模型或者哪个请求占用了资源&#xff0c;也不知道是从什么时候开始出现高…

ansible的脚本------playbook剧本

playbook组成部分&#xff1a; 1.task 任务&#xff1a;包含要在目标主机上执行的操作&#xff0c;使用模块定义这些操作。每个都是一个模块的调用。2.variables 变量&#xff1a;存储和传递数据。变量可以自定义&#xff0c;可以在playbook当中定义为全局变量&#xff0c;也可…

AI for Science 塑造多学科研究新范式!欢迎参加 WAVE SUMMIT+2023深度学习开发者大会平行论坛

在人工智能飞速发展中&#xff0c;大模型已经崭露头角&#xff0c;引领了新一轮的技术潮流。大模型&#xff0c;凭借其对复杂模式和关系的深度理解能力&#xff0c;展现出在科学研究中的巨大应用潜能。通过大模型&#xff0c;科学家们能更深入地揭示科学现象的内在规律&#xf…

Docker 核心技术

Docker 定义&#xff1a;于 Linux 内核的 Cgroup&#xff0c;Namespace&#xff0c;以及 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于操作系统层面的虚拟化技术&#xff0c;由于隔离的进程独立于宿主和其它的隔离的进程&#xff0c;因此也称其为容器Docke…

K8s攻击案例:RBAC配置不当导致集群接管

01、概述 Service Account本质是服务账号&#xff0c;是Pod连接K8s集群的凭证。在默认情况下&#xff0c;系统会为创建的Pod提供一个默认的Service Account&#xff0c;用户也可以自定义Service Account&#xff0c;与Service Account关联的凭证会自动挂载到Pod的文件系统中。 …

Opencv入门五 (显示图片灰度值)

源码如下&#xff1a; #include <opencv2/opencv.hpp> int main(int argc, char** argv) { cv::Mat img_rgb, img_gry, img_cny; cv::namedWindow("Example Gray",cv::WINDOW_AUTOSIZE); cv::namedWindow("Example Canny", cv::WINDOW_…

Leetcode—96.不同的二叉搜索树【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—96.不同的二叉搜索树 算法思想 实现代码 class Solution { public:int numTrees(int n) {vector<int> G(n 1, 0);G[0] 1;G[1] 1;for(int i 2; i < n; i) {for(int j 1; j < i; j) {G[i] G[j - 1] * …

npm login报错:Public registration is not allowed

npm login报错:Public registration is not allowed 1.出现场景2.解决 1.出现场景 npm login登录时,出现 2.解决 将自己的npm镜像源改为npm的https://registry.npmjs.org/这个&#xff0c;解决&#xff01;

MAC苹果笔记本电脑如何彻底清理垃圾文件软件?

苹果电脑以其流畅的操作系统和卓越的性能而备受用户喜爱。然而&#xff0c;随着时间的推移&#xff0c;系统可能会积累大量垃圾文件&#xff0c;影响性能。本文将介绍苹果电脑怎么清理垃圾文件的各种方法&#xff0c;以提升系统运行效率。 CleanMyMac X是一款专业的Mac清理软件…

力扣:203. 移除链表元素(Python3)

题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 …