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

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

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

这个我们分析的是basic_ostream<>,真正完整的流类。在分析之前,我们需要明确的是,许多的工作都是由locale对象里的facet完成的。

 首先是类中会用到的类型声明:

	typedef basic_ostream<_Elem,_Traits> _Myt;
	typedef basic_ios<_Elem,_Traits> _Myios;
	typedef basic_streambuf<_Elem, _Traits> _Mysb;
	typedef ostreambuf_iterator<_Elem, _Traits> _Iter;
	typedef num_put<_Elem, _Iter> _Nput;
	typedef typename _Traits::int_type int_type;
	typedef typename _Traits::pos_type pos_type;
	typedef typename _Traits::off_type off_type;

值得庆幸的是:这个类中没有增加新的数据成员,主要是完成我们平常使用的一些接口函数的实现,其中最有代表性的就是:operator<<。

首先,类引入了哨兵机制:

	//哨兵
	class _Sentry_base
	{//store thread lock and reference to out stream
	public:
		_Sentry_base(_Myt& _ostr)
			:_myostr(_ostr)
		{//look the stream buffer
			if(_myostr.rdbuf()!=0)
				_myodtr.rdbuf()->_Lock();
		}
		~_Sentry_base()
		{//destroy after unlocking
			if(_myostr.rdbuf()!=0)
				_myostr.edbuf()->_Unlock();
		}
		_Myt& _myostr;
	private:
		_Sentry_base& operator=(const _Sentry_base&);
	};

	class sentry :public _Sentry_base
	{//stores thread lock and state of stream
	public:
		explicit sentry(_Myt& _ostr)
			:_Sentry_base(_ostr)
		{
			if(_ostr.good() && _ostr.tie()!=0)
				_ostr.tie()->flush();
			_ok=_ostr.good();//store test only after flush tie
		}
		~sentry()
		{//destroy the object
			if(!uncaught_exception())
				this->_myostr._Osfx();
		}
	private:
		bool _ok;//true if stream state okay at construction
		sentry(const sentry&);//not defined
		sentry& operator=(const sentry&);
	};
	bool opfx()
	{//test stream state and flush tie stream 
		if(ios_base::good() && _Myios::tie()!=0)
			_Myios::tie()->flush();
		return (ios_base::good());
	}
	void osfx()
	{//perform any wrapup
		_Osfx();
	}
	void _Osfx()
	{
		if(ios_base::flags() & ios_base::unitbuf)//当缓冲区不为空时,输出处理
			flush();
	}

这个哨兵,主要是完成三个工作:状态测试--保证流在可工作状态;保证线程安全;构造和销毁时是否或者说是如何刷新缓冲区的操作。它的使用范围很广,以至于我们大多数情况下觉得它有些浪费,尤其是在扩展自己的operator<<时。

 下面的函数是为了能够使用strm<<oct<<val;此类语句,使操控器变得好用的关键:

	_Myt& operator<<(_Myt& (*_pfn)(_Myt&))
	{//call basic_ostream manipulator
		return((*_pfn)(*this));
	}
	_Myt& operator<<(_Myios& (*_pfn)(_Myt&))
	{
		return((*_pfn)(*this));
	}
	_Myt& operator<<(_Myios& (*_pfn)(_Myios&))
	{
		(*_pfn)(*(_Myios*)this);
		return *this;
	}

怎么把一个数据写到流中?

	typedef bool _Bool;
	_Myt& operator<<(_Bool _val)
	{
		ios_base::iostate _state=ios_base::goodbit;
		const sentry _ok(*this);
		if(_ok){
			//state okay use facet to insert
			const _Nput& _nput_fac=_USE(ios_base::getloc(),_Nput);
			if(_nput_fac.put(_Iter(_Myios::rdbuf()),*this,_Myios::fill(),_val).failed())
				_state|=ios_base::badbit;
		}//put(to,fmt,fill,value),to是output迭代器,fmt是格式信息,fill是填充字符,put返回一个迭代器指向下一个位置
		_Myios::setstate(_state);
		return(*this);
	}
	_Myt& operator<<(short _val)
	{
		ios_base::iostate _state=ios_base::goodbit;
		const sentry _ok(*this);
		if(_ok){
			const _Nput& _nput_fac=_USE(ios_base::getloc(),_Nput);
			ios_base::fmtflags _bfl=ios_base::flags()&ios_base::basefield;
			bool _tmp=(_bfl==ios_base::oct||_bfl==ios_base::hex)?(long)(unsigned short)_val,(long)_val;
			if(_nput_fac.put(_Iter(_Myios::rdbuf()),*this,_Myios::fill(),_tmp).failed())
				_state|=ios_base::badbit;
		}
		_Myios::setstate(_state);
		return(*this);
	}

其基本操作流程:首先构造sentry对象,如果sentry对象时“良好”的,那么开始使用locale中相应的facet将数据写到缓冲区内,如果失败则将流状态改为bad,最后更新流状态;注意,facet完成了绝大部分最困难的工作,完成数据的格式化,写到缓冲区,缓冲区的行为由具体的缓冲类决定。除了bool,short型之外,还有int,double。。。的重载类型,此处不赘述。不过下面的这个重载版本值得注意:

	//其余的各个类型就不写了
	_Myt& operator<<(_Mysb* _strbuf)
	{
		ios_base::iostate _state=ios_base::goodbit;
		bool _copied=false;
		const sentry _ok(*this);
		if(_ok && _strbuf!=0){
			for(int_type _meta=_Traits::eof();;_copied=true){
	  		//extract another character from stream buffer
			_meta=_Traits::eq_int_type(_Traits::eof(),_meta)?_strbuf->sgetc():_strbuf->snextc();
			
			if(_Traits::eq_int_type(_Traits::eof(),_meta))
				break;
			if(_Traits::eq_int_type(_Traits::eof(),_Myios::rdbuf()->sputc(_Traits::to_char_type(_meta))))
			{
				_state|=ios_base::badbit;
				break;
			}
			}
		}
		ios_base::width(0);
		_Myios::setstate(_strbuf==0?ios_base::badbit :(!_copied?_state|ios_base::failbit:_state);
		return (*this);
	}

这个重载版本对于效率上的提升很重要,我们可以使用如下形式:cout<<cin.rdbuf();

剩下的函数就是对缓冲类函数的重包装,例如:put,write,flush等等都是将工作转交给缓冲类。

下面的函数实现读取一个字符,不同于bool,int型等的格式化的复杂性,对于读取资格字符,我们不需要facet对象,可以直接完成:

template<class _Elem,class _Traits>
inline basic_ostream<_Elem,_Traits>& operator<<(
	basic_ostream<_Elem,_Traits>& _ostr,_Elem _ch)
{//insert an character
	typedef basic_ostream<_Elem,_Traits> _Myos;
	ios_base::iostate _state=ios_base::goodbit;
	const typename _Myos::sentry _ok(_ostr);
	if(_ok){
		streamsize _pad=_ostr.width()<1?0:_ostr.width()-1;
		if((_ostr.flags()&ios_base:;adjustfield)!=ios_base::left)
			for(;_state==ios_base::goodbit && 0<_pad;--pad)
				//pad on left
					if(_Traits::eq_int_type(_Traits::eof(),_ostr.rdbuf()->sputc(_ostr.fill())))
						_state|=ios_base::badbit;
		
		if(_state==ios_base::goodbit && _Traits::eq_int_type(_Traits::eof(),_ostr.rdbuf()->sputc(_ch)))
			_state|=ios_base::badbit;

		for (; _state == ios_base::goodbit && 0 < _pad;--_pad)	// pad on right
			if (_Traits::eq_int_type(_Traits::eof(),
				_ostr.rdbuf()->sputc(_ostr.fill())))
				_state |= ios_base::badbit;
	}
	_ostr.width(0);
	_ostr.setstate(_state);
	return _ostr;
}

主要是完成左对齐还是右对齐,字段宽度及填充。对于_Elem为char或wchar版本的特化版本,此处不赘述。

最后附一个endl操控器的代码:

template<class _Elem,class _Traits>
	inline basic_ostream<_Elem, _Traits>& endl(basic_ostream<_Elem, _Traits>& _ostr)
	{	// insert newline and flush stream
	_ostr.put(_ostr.widen('\n'));
	_ostr.flush();
	return (_ostr);
	}

其基本的ios_base& function(ios_base&)的形式没变,不过不同于以前我们定义过的操控器,此操控器不只是设置格式化信息,而是实实在在的操作。


下面是ostringstream类的源码,你会发现这个类做的工作只是包装,全部的工作已经由原先的基类完成,我们对于扩展自己的流类也会如此简单:

template<class _Elem,
	class _Traits,
	class _Alloc>
	class basic_ostringstream
		: public basic_ostream<_Elem, _Traits>
	{	// output stream associated with a character array
public:
	typedef basic_ostringstream<_Elem, _Traits, _Alloc> _Myt;
	typedef basic_ostream<_Elem, _Traits> _Mybase;
	typedef _Alloc allocator_type;
	typedef basic_stringbuf<_Elem, _Traits, _Alloc> _Mysb;
	typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;

	explicit basic_ostringstream(ios_base::openmode _Mode = ios_base::out)
		: _Mybase(&_Stringbuffer),
			_Stringbuffer(_Mode | ios_base::out)
		{	// construct empty writable character buffer
		}

	explicit basic_ostringstream(const _Mystr& _Str,
		ios_base::openmode _Mode = ios_base::out)
		: _Mybase(&_Stringbuffer),
			_Stringbuffer(_Str, _Mode | ios_base::out)
		{	// construct writable character buffer from NTCS
		}

	basic_ostringstream(_Myt&& _Right)
		: _Mybase(&_Stringbuffer)
		{	// construct by moving _Right
		_Assign_rv(_STD forward<_Myt>(_Right));
		}

	_Myt& operator=(_Myt&& _Right)
		{	// move from _Right
		_Assign_rv(_STD forward<_Myt>(_Right));
		return (*this);
		}

	void _Assign_rv(_Myt&& _Right)
		{	// assign by moving _Right
		if (this != &_Right)
			{	// different, worth moving
			_Stringbuffer.str(_Mystr());
			this->swap(_Right);
			}
		}

	void swap(_Myt& _Right)
		{	// swap with _Right
		if (this != &_Right)
			{	// different, swap base and buffer
			_Mybase::swap(_Right);
			_Stringbuffer.swap(_Right._Stringbuffer);
			}
		}

private:
		basic_ostringstream(const _Myt& _Right);	// not defined
		_Myt& operator=(const _Myt&);	// not defined
public:
	virtual ~basic_ostringstream() _NOEXCEPT
		{	// destroy the object
		}

	_Mysb *rdbuf() const
		{	// return pointer to buffer
		return ((_Mysb *)&_Stringbuffer);
		}

	_Mystr str() const
		{	// return string copy of character array
		return (_Stringbuffer.str());
		}

	void str(const _Mystr& _Newstr)
		{	// replace character array from string
		_Stringbuffer.str(_Newstr);
		}

private:
	_Mysb _Stringbuffer;	// the string buffer
	};


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

相关推荐

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

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

jhfyuf的博客 4680

C语言中,为什么字符串可以赋值给字符指针变量

本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一、 C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5';p=&a; //显然是正确的,p="abcd"; //但为什么也可以这样赋值??问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点! 答: 双引号做了3件事:...

weixin_34239169的博客 210

C++中输入流istream状态管理3

在《C++中输入流istream状态管理2》中提到,rdstate()成员函数可以获取流当前的状态,即ios_base::iostate。 1 ios_base::iostate的状态值 ios_base::iostate对应的状态有ios_base::goodbit、ios_base::eofbit、ios_base::badbit和ios_base::failbit。ios_base::iostate是四个字节,即32位的变量,在xiosbase中定义。ios_base::goodbit、ios_b

hou09tian的博客 1235

C++标准库笔记:13.6 操控器

操控器是什么std::cout << std::endl;此句代码中std::endl为操控器,操控器是用来操控stream对象的,常常只会改变输入或格式化输出的解释方式。 std::cout << std::endl:输出’\n’,并刷新output缓冲区 std::cout << std::ends:输出’\0’ std::cout << std::flush:刷新output缓冲区 std::

憧憬,思考,奋斗,飞翔 716

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

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

weixin_35649491的博客 1314

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

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

weixin_33193177的博客 769

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

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

夏天又到了的专栏 3182

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 302

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

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

wangyanphp的专栏 1212

制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制“大白”颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮,断开后闪烁 l 配网按键 l 云端定时功能 l 云端报警提示功能 l 云端历史数据查看 l 远程升级介绍 视频演示:【开源】制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)_哔哩哔哩_bilibili 一、界面展示 ...

东小东博客 7115

手把手教你用CV5200模块搭建无人机高清图传系统(含实测数据)

本文提供了一份基于CV5200模块搭建远距离无人机高清图传系统的完整实战指南。文章详细解析了系统架构、硬件连接、软件配置与优化,并分享了实地飞行测试数据。核心在于利用CV5200的LR-WiFi私有协议,在视距下实现数公里级的稳定高清视频传输,为DIY爱好者和行业应用提供了高性价比的解决方案。

day7的博客 720

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

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

wangyanphp的专栏 945

Gromacs文件格式全解析:xtc vs trr vs cpt,哪种更适合你的模拟需求?

本文深入解析Gromacs分子动力学模拟中的三种核心文件格式xtc、trr和cpt,详细对比其技术特性和适用场景。xtc适合存储效率优先的场景,trr保留完整动力学数据,cpt确保模拟精确重启。通过实际配置示例和存储优化技巧,帮助用户根据模拟需求选择最佳格式组合,平衡分析灵活性与存储成本。

weixin_29281941的博客 96

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

NPP/VIIRS夜间灯光数据下载和介绍

夜间灯光数据作为当前比较火热的研究数据,与其他遥感数据不同,它是通过DN值来体现所携带的信息,最常用的使用月度数据。 该数据数据量大,下载慢,相对来说较难快速获取。 一、数据下载 美国国家海洋大气管理局NOAA下属的NCEI国家环境信息中心Earth Observation Group。 二、月度数据文件介绍 从网站上下载的逐月的灯光数据文件是压缩包的形式,每月的数据包括vcm, vcmsl两个版本的压缩包,其中vcm版本排除了受杂散光影响的数据,vcmsl版本为辐射值经过杂散光校正程序后的数

端木宛白的博客家园 7376

影像技术实战02:FFmpeg 镜头切分误检、漏检问题排查与基于场景变化的稳定分镜方案

本文介绍了基于FFmpeg的镜头切分技术在实际应用中的常见问题及解决方案。文章首先指出单纯使用select='gt(scene,0.4)'命令进行镜头检测存在误检、漏检等问题,包括黑场、字幕变化被误判为镜头切换,以及相似场景切换被漏检等情况。随后提出了一套四层架构的稳定解决方案:1)用FFmpeg提取候选镜头变化点;2)解析变化点时间和分数;3)通过后处理过滤异常点;4)按时间点切割视频片段并生成报告。文中详细展示了Python实现代码,包括场景点检测、时间间隔过滤等功能模块,为视频剪辑、影视解说等场景提供

ai技术增长的博客 400

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

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

心在天涯 2180

自动化Google Chrome的强大工具:chromedriver下载、安装、简单使用

本文介绍了 ChromeDriver 的基本概念和安装配置方法,重点讲解了如何通过 Selenium 实现 Chrome 浏览器的自动化测试。内容涵盖了 ChromeDriver 下载、版本匹配、依赖引入和简单的自动化测试脚本示例,帮助读者快速上手并避免常见问题。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 88万+

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

6、直流微电网中恒功率负载(CPL)的稳定性分析与控制策略

本文探讨了直流微电网中恒功率负载(CPL)带来的稳定性问题,并深入分析了其影响机制及相应的缓解策略。文章首先通过小信号模型和非线性分析揭示了CPL对系统稳定性的影响,接着讨论了被动稳定方法的优缺点,最后重点介绍了基于时间的方法和几何控制器等控制策略。这些方法各有优劣,在实际应用中需结合具体需求选择合适方案,以实现直流微电网的稳定运行。

star的博客 227

数学建模模型总结

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

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

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

wangyanphp的专栏 912

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

qq_59940419的博客 1506

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

如何在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
上一篇: C++的I/O(vc版)(五)
下一篇: C++的I/O(vc版)(七)
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值