C++对于文件的操作(2)—— 使用istringstream实现split功能

因为这个软件的功能涉及到字符串的切割并重组,不过因为string中没有split函数,因此就想自己写一个字符串分割函数。
在网上查阅了相关的资料之后,发现istringstream流可以实现这个功能。
istringstream流可以绑定任意的string字符串,并且可以像fstring似的把被操作的对象当成一个“流”进行处理,并且istringstream有一个getLine函数的重载函数,可以实现对于指定分隔符的分割操作。
注意,在使用istringstream之前,需要包含他的头文件sstream,代码如下:

#include <iostream>
#include <string>
#include <sstream>
#include <list>

using namespace std;

list<string> split(const string&str, char splitFlag)
{
    if (!str.empty())
    {
        istringstream iss(str);
        list<string> resultSplit;
        char buffer[1024] { 0 };

        while (iss.getline(buffer, 1024, splitFlag))
        {
            resultSplit.push_back(buffer);
        }
		//也可以写成下述方式
		//string strTemp;
		//while (getline(iss, strTemp, splitFlag))
		//{
			//resultSplit.push_back(strTemp);
		//}
		
        return resultSplit;
    }
    else
    {
        return list<string>();
    }
}

int main()
{
    string str("192.168.3.4");
    auto result = split(str, '.');
    for (const auto& str : result)
    {
        cout << str << "  ";
    }
    cout << endl;
    
    return 0;
}

运行结果如下:
在这里插入图片描述getLine的源码如下:

_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
{	// get up to _Count characters into NTCS, discard newline
return (getline(_Str, _Count, _Myios::widen('\n')));
}

_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
	streamsize _Count, _Elem _Delim)
{	// get up to _Count characters into NTCS, discard _Delim
	ios_base::iostate _State = ios_base::goodbit;
	_Chcount = 0;
	const sentry _Ok(*this, true);

	if (_Ok && 0 < _Count)
		{	// state okay, use facet to extract
		int_type _Metadelim = _Traits::to_int_type(_Delim);

		_TRY_IO_BEGIN
		int_type _Meta = _Myios::rdbuf()->sgetc();

		for (; ; _Meta = _Myios::rdbuf()->snextc())
			if (_Traits::eq_int_type(_Traits::eof(), _Meta))
				{	// end of file, quit
				_State |= ios_base::eofbit;
				break;
				}
			else if (_Meta == _Metadelim)
				{	// got a delimiter, discard it and quit
				++_Chcount;
				_Myios::rdbuf()->sbumpc();
				break;
				}
			else if (--_Count <= 0)
				{	// buffer full, quit
				_State |= ios_base::failbit;
				break;
				}
			else
				{	// got a character, add it to string
				_DEBUG_POINTER(_Str);
				*_Str++ = _Traits::to_char_type(_Meta);
				++_Chcount;
				}
		_CATCH_IO_END
		}

	*_Str = _Elem();	// add terminating null character
	_Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);
	return (*this);
}

通过追踪其源码,可以发现其分隔符只能是一个char类型的字符,并且缺省条件下为’\n’另外,后面return(*this)表明这个字符串在getLine的条件下,是相当于不断被吃掉的,这就是“流”的特点,直到最后没有东西吃的时候,就返回一个nullptr。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值