C++的I/O(vc版)(七)

C++的I/O(vc版)(四) 下面进行我们的第二大类,流缓冲类。stream并不负责写或者读,毕竟如它原本的目的一样:负责格式化,存储格式化信息;当然我们还用它存储状态信息等等。stream把它的读写工作转交给stream buffer,即缓冲区类。 缓冲区类主要是围绕着位置展开操作,下面先介绍一个与位置有关的类: /*fpos:它可以存储还原任何流中的任意文件的位置指示器所需的所有信息 * 对象的类 fpos 阅读详情

  首先,我们还有很多的类没有分析:istream,filestream,filebuf,还有对应得迭代器。第二,即使前面的分析也不能说明I/O的使用规范。如果想要熟练的使用I/O,建议读《C++标准程序库》,那是一本经典。第三,流的格式化读取和输出大部分依靠的是locale,而我们前面很少涉及,现在还看不懂源码,只能以后分析了。

 下面摘抄《c++标准程序库》中关于如何自定义I/O操作符的说明。

  一,对于格式化化读取或者输入。

  什么是格式化操作,就是有格式。例如一个文件里都是float,我们就可以按float读取。因为格式化操作都是转交给locale对象的,而根据流中预定义的操作,我们使用operator<<和operator>>来完成格式化处理。所以这里的主题是:如何重载这两个操作符?

  (1)这里完全抄袭《c++标准程序库》中的例子:对于分数Fraction对象,按“分子/分母”格式,进行格式化输入和输出。

inline std::ostream& operator<<(ostream& strm,const Fraction& f)
{
	strm<<f.numerator()<<'/'<<f.denominator();
	return strm;
}

这是大多数人的重载方式,但是有两个缺点:

1.只适用于ostream即:字符型别为char的stream。

2.如果字符宽度被设定,则只会施加于分子上。

改进的重载模式:

template<class charT,class traits>
inline std::basic_ostream<charT,traits>&
	operator<<(std::basic_ostream<charT,traits>& strm,const Fraction& f)
{
	basic_ostringstream<charT,traits> s;
	s.copyfmt(strm);
	s.width(0);//令s的宽度为0,这样对于这个f,就没有填充宽度
	s<<f.numerator()<<'/'<<f.denominator();
	strm<<s.str();
	return strm;
}

(2)同理对于重载:operator>>,我们需要的是检查是否正确:

template<class charT,class traits>
inline std::basic_ostream<charT,traits>&
	operator>>(std::basic_ostream<charT,traits>& strm, Fraction& f)
{
	int n,d;
	strm>>n;
	//检查后面是否是'/'
	if(strm.peek()=='/'){
		strm.ignore();
		strm>>d;
	}else{
		d=1;
	}
	//检查分母是否为0
	if(d==0){
		strm.setstate(ios::failbit);
		return strm;
	}
	//只有上述条件都符合,才能构建fraction'对象
	if(strm){
		f=Fraction(n.d);
	}
	return strm;
}
(3),对于具有虚拟继承和多态特性的输入输出,我们必须借助于辅助函数,然后在<<和>>中调用辅助函数;


二,以非格式化函数完成输入输出

 非格式化就是我们只能一个一个字符的读取,不能直接读取int或者float:

对于这类函数,我们应该直接使用缓冲类的接口,因为这样就没有sentry的代价,否则,每调用一次<<或>>就会产生一个sentry。

流中有很多预定义的非格式化输入输出函数:如write,read。。。

三:直接使用stream缓冲区:

  进行无格式化I/O时,我们尽量使用缓冲区操作,对于缓冲区的操作接口,这里不列出。

 主要说明的是我们前面文章提到的_Myt&   operator<<(_Mysb *_Strbuf)操作符:

cout<<cin.rdbuf();
cin>>noskipws>>cout.rdbuf();

由源码我们得知:会将缓冲区的内容全部输入和输出,同时缓冲区的指针也移动到末尾。

对于格式化的I/O,我们有时候出于效率的考虑,也会直接使用缓冲区,因为格式化的工作交给了locale,我们必须自己使用locale对象操作,这样的话就不必总是构造sentry对象;但是----不安全!


四,自定义I/O操作符的惯例:

(1)你的输出格式应该能让其他的使用者使用input操作符无损的读取数据,尤其是strings的空格问题;

(2)进行I/O时,应该考虑现有的stream格式规范,尤其是改写宽度时;

(3)如果发生错误,应设立相应的状态位;

(4)如果发生错误,原对象不应有任何改变。如果读取多个数据,读入的数据应该在被传递到对象前,先存储于辅助对象;

(5)输出不应以new line符号结束

(6)如果检测到某个格式错误,应该尽可能的不读取任何字符。



c++builder调用VC的dll以及VC调用c++builder的dll 解析__cdecl,__fastcall, __stdcall 的不同:在函数调用过程中,会使用堆栈,这三个表示不同的堆栈调用方式和释放方式。 比如说__cdecl,它是标准的c方法的堆栈调用方式,就是在函数调用时的参数压入堆栈是与函数的声明顺序相反的,其它两个可以看MSDN,不过这个对我们编程没有太大的作用 ------------------------------------------ 阅读详情

相关推荐

使你的C/C++代码支持Unicode

使你的C/C++代码支持Unicode

jhfyuf的博客 4680

C++文件I/O示例

文章标题:C原 作 者:querw原 出 处:www.vczx.com发 布 者:querw发布类型:原创发布日期:2004-10-05今日浏览:8总 浏 览:144// 国庆没事写着玩的,英文很烂,请把注意力集中在代码上,呵呵:) // c++基于流的文件操作使很多C转过来的程序员在操作文件时还是选择了 FILE* // :)其实,C++的流操作文件也很方便啊

Que's C++ Studio 2967

VC/C++实现TXT到DAT文件转换的源代码

本文还有配套的精品资源,点击获取 简介:在IT行业中,文件格式转换是一个常见任务,特别是在文本数据处理方面。本文详细介绍了如何通过VC/C++编程语言实现从TXT文本文件到DAT数据文件的转换。此转换流程包括读取TXT文件内容、数据预处理、创建并写入DAT文件等步骤。在VC/MFC环境中,还可以利用MFC库简化文件操作,并创建图形用户界面。 1. 文件格式转换基础...

weixin_35649491的博客 1314

用C++实现简单的文件I/O操作

        文件 I/O 在C++中比烤蛋糕简单多了。 在这篇文章里,我会详细解释ASCII和二进制文件的输入输出的每个细节,值得注意的是,所有这些都是用C++完成的。  一、ASCII 输出  为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用取代,所有的C++标准头文件都是无后缀的。)。这是 的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上, 已经被包含了,

天行健 ● 君子以自强不息 3798

高效处理大文件的重叠I/O VC++源代码解析

OVERLAPPED结构体是Windows平台上用于处理异步I/O请求的一种数据结构。它允许应用程序在文件操作(如读取和写入)进行的同时,继续执行其他任务。在本章节中,我们详细讨论了OVERLAPPED结构体的介绍、在重叠I/O中的应用,以及处理超大文件和错误管理的高级技巧。在Windows平台开发中,合理利用OVERLAPPED结构体能够有效提升应用程序的性能和效率。在接下来的章节中,我们将继续探讨如何在VC++中实现重叠I/O,以及WinAPI中CreateFileReadFile。

weixin_33193177的博客 769

一文详解Stata重复测量方差分析的概念、原理、适用情形以及操作命令实现、对结果的解读、操作注意事项 附零基础小白友好入门Stata统计学/计量经济学学习路径

重复测量方差分析(Repeated Measures ANOVA)适用于同一受试者在不同时间点或条件下的多次测量数据,如疗效跟踪和跨条件对比研究。其核心特征包括:数据结构为每个受试者多个观测值,数据具有相关性(违反独立性假设),变异分解为个体间和个体内变异。关键假设包括正态性、方差齐性和球形性(通过Mauchly检验验证)。适用场景包括纵向研究和小样本追踪,但不适用于存在滞留效应或学习效应显著的数据。操作步骤涉及数据准备(宽/长格式转换)、正态性与球形性检验、主分析命令(单/多因素)及事后检验。

m0_72274883的博客 1565

C++编程实例-I/O流

实验16 I/O流【实验目的】通过本实验,掌握I/O流、流类成员函数及流类对象的概念。【实验要求】⑴掌握I/O流的概念。⑵建立简单的文件。【实验内容】练习下面的程序1)分别执行//(1)、//(2)及//(3)下面定义的语句。#includeusing namespace s

Neil 1365

AHB总线协议

1. 简介         AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内

ivy_reny的专栏 8万+

Linux C\C++方式下的文件I/O编程

在旧头文件里的fstream.h,如果使用ifstreamfile的默认参数声明一个输入文件流,当这个要读的file文件不存在时,会自动创建一个空文件,从而给判断文件是否存在造成了很多麻烦。因为C++兼容C,所以C中的输入输出函数依然可以在C++中使用,但是很显然,直接把C的那套输入输出搬到C++中肯定无法满足C++的需求,更重要的一点是,C中的输入输出有类型要求,只支持基本类型,因此C++设计了易于使用的并且多种输入输出流接口统一的I/O类库,并且支持多种格式化操作,还可以自定义格式化操作。

夏天又到了的专栏 3182

Python数据分析实战:用TIGRAMITE库5步搞定时间序列因果分析(附完整代码)

本文详细介绍了如何使用TIGRAMITE库进行时间序列因果分析,通过5个步骤从环境配置到模型优化,帮助读者掌握因果关系库的应用。附完整代码示例,适合数据分析师和研究人员快速实现复杂时间序列的因果发现。

weixin_29050271的博客 160

图解电动汽车:电动汽车的分类

前面《电动汽车简介》中简单介绍了电动汽车的分类,主要包括混合动力电动汽车(HEV)和纯电动汽车(BEV)两大类。其中,混合动力汽车又可分为非插电式混合动力汽车、插电式混合动力汽车(PHEV)以及增程式电动汽车(REEV)。 主要分类 简单来说,各类电动汽车的特点如下。 纯电动汽车(BEV)就是指动力来源完全由电能提供,由电动机驱动的汽车,并且电能储存在电池中。 混合动力汽车(HEV)则是指动力来源可以是化石燃料,也可以是电能,并且电能除了可以存储在电池中,还可以由化石能源转化而来。 非插电式混合动力汽车

程序员「阿基米东」的编程之旅 3089

c++的I/O(vc版)(一)

c++的I/O是我们最常用的库之一,也是操作复杂,功能复杂的类库之一。  在C++的程序中,很少有不用I/O的程序,但是,对于我来说,I/O我却用的出奇的差,只会几个简单的函数,尽管够用,但是却用的效率奇低,于是,在此学习c++ I/O类库的使用方法。 首先是I/O中流的概念,c++的I/O中的所有的操作都是基于流。 流i/o:要传递的数据是无结构的字节流,字符流或者任意同等大小单位

wangyanphp的专栏 1212

Qt C++ 的虚拟演播室系统

**数据流转**:OpenCV 处理的图像格式通常是 `cv::Mat`,而 Qt 3D 渲染需要 `QImage` 或 `QTexture2D`。// 临时用颜色代替。// 前景在背景前面。#### 3.3 主窗口与 Qt 3D 集成 (`mainwindow.h` / `.cpp` / `.ui`)* **更复杂的 3D 场景**:加载 3D 模型(.obj, .gltf 等)作为背景和道具。1. **构建项目**:确保 `.pro` 文件中的 OpenCV 路径配置正确,然后构建项目。

寒寒豆豆软件公司的博客 112

C++的I/O(vc版)(六)

首先回忆一下,我们已经分析过的类:基本的流类完成:流状态信息,格式化信息,其中一些不能用掩码表示,需要特定的数据成员,locale对象,流缓冲类指针,耦合的ostream;基本的流缓冲类完成:六个指针的存储。 这个我们分析的是basic_ostream  首先是类中会用到的类型声明: typedef basic_ostream _Myt; typedef basic_ios _Myios

wangyanphp的专栏 1678

86、高斯过程:学习、应用与自动相关性确定

本文介绍了高斯过程回归的基本原理及其在实际应用中的关键技术,重点探讨了通过最大化对数似然函数来学习模型超参数的方法,并详细阐述了自动相关性确定(ARD)技术如何用于评估输入变量的重要性。文章涵盖了从协方差函数定义、梯度计算到优化算法的应用流程,并通过流程图和表格形式总结了核心步骤与公式。此外,还讨论了贝叶斯处理方式及异方差问题的建模策略,展示了高斯过程在复杂数据建模中的灵活性与强大能力。

android的专栏 114

成功解决使用jupyter notebook命令打开原先存的.ipynb文件突然消失的问题

成功解决使用jupyter notebook命令打开原先存的.ipynb文件突然消失的问题 目录 解决问题 解决思路 解决方法 T1、修改默认配置 T2、修改后缀参数(此方法是其他网友推荐,博主没有尝试) T3、如果以上还不成功,这个时候很可能是环境配置有问题 解决问题 使用jupyter notebook命令打开原先存的.ipynb文件突然消失的问题 解决思路 使用jupyter notebook命令打开原先存的.ipynb文件突然消失,说明...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5116

C++的I/O(vc版)(三)

前面已经分析完ios_base类了,现在来分析一下basic_ios //此处为了简洁,将许多别文件的定义搬到此文件 typedef int _Mbstatet; typedef fpos streampos; typedef streampos wstreampos; #define EOF (-1)//原本定义于stdio.h //下面是类char_traits的定义 //不同的字符集,不同

wangyanphp的专栏 1346

用 PERFORM ... ON COMMIT / ON ROLLBACK 把收尾工作做干净:从 SAP LUW 到 Update Task 的事务钩子实践

ABAP事务钩子机制解析 本文深入探讨SAP ABAP开发中的事务边界管理问题,重点分析PERFORM ... ON COMMIT/ROLLBACK机制: 事务分层:区分Database LUW(数据库提交)和SAP LUW(业务逻辑单元),后者通过COMMIT WORK触发多种收尾动作 钩子机制:PERFORM...ON COMMIT将子程序注册为事务结束回调,在提交/回滚时执行清理工作而非业务更新 执行顺序:钩子程序先于Update Task执行,仍保留当前会话内存上下文 现代实践:建议将FORM仅作为

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3995

C++的I/O(vc版)(二)

根据流类体系,我们可以看出基本的流类是ios_base和basic_ios  首先是ios_base是流类始祖,先分析ios_base,ios_base中储存的是不依赖于读写的数据的类型的基本信息,如格式化信息、异常状态、事件回调函数等。 首先看一下数据成员: iostate _mystate;//stream state iostate _except_;//except

wangyanphp的专栏 945

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VC中C++的输入输出I/O 流函数

(1)什么是“流”?   C++中的“流”(stream)是一种抽象,它表示数据从源端流向目的端。   输入流(Input Stream)表示的是数据从输入设备(如键盘、磁盘等)流向内存,输出流(Output Stream)表示的是数据从内存流向输出设备(如屏幕、打印机、磁盘等)。输入输出流(I/O Stream)是输入流和输出流的合称。   “流”中的内容可以是任意形式的数据,例如:ASC

心在天涯 2180

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++的I/O(vc版)(五)

具体的缓冲类有filebuf,stringbuf,由于filebuf的大部分工作都转交给了C流,不好分析,所以重点分析的还是stringbuf。  对于stringstream,我们最常用的语句就是: string s="1.2 5.6 7 7 "; istringstream is(s); float f; is >> f; 上述语句,给出了stringbuf的基本形式:以string初

wangyanphp的专栏 1239

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++打造局域网聊天室第八课: 异步I/O模型及多线程

C++打造局域网聊天室第八课: 异步I/O模型及多线程

qq_59940419的博客 1506

如何在Visual Studio中新建MB-System的I/O模块

实现了在windows平台下使用Microsoft Visual Studio Community 2022 (64 位)构建MB-system的I/O模块项目,用于将国产声呐数据添加到MB-system的数据支持中去。

qq_21472607的博客 1272

socket网络通信(重叠I/O方式实现)包含4种方式

采用重叠I/O方式实现的socket网络编程,异步非阻塞方式,代码效率比阻塞式的socket编程方式高。实现了TCP server,TCP client,UDP server,UDP client,四种方式可选,可以使用在各种场合用于监控网络数据。本程序只支持单客户端和服务端的应用场合。代码封装成库形式,非常方便移植。平台使用的是VC6.0,语言用的是C++,MFC做的界面。使用ws2_32....

hill_guo的博客 824

基于函数的I/O操作(头文件stdio.h)

基于函数库的I/O是C语言标准库的功能,基于系统级I/O函数实现。 系统级I/O函数对文件的标识是文件描述符,C语言标准库中对文件的标识是指向FILE结构的指针。在头文件cstdio或stdio.h中声明了FILE结构,并对其他与标准I/O有关的常量、数据结构、函数等进行了定义。 文件是用一个指向特定结构的指针来标识的,这个特定结构就是FILE结构,它描述了包含文件描述符在内的一...

380

ACE学习笔记(一)--I/O事件多路分离

  由于开博时这本电子书已经看了不少了,所以就不从新写了。这本电子书总体来说不错,毕竟是马维达的作品,但是有不少错误,而且不是针对入门的,向我这种刚刚转向C++的,啃起来十分困难。硬着头皮啃吧 在这本书中,有一段讲I/O事件多路分离的问题的源码,照样敲入后和我想象的结果不一样,源码如下:下边的程序在VC已经编译通过,用的是ACE5.4,运行该服务时,我通过telnet向该服务端口发字符串

1510
上一篇: C++的I/O(vc版)(六)
下一篇: STL源码--alloc
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值