用stringstream进行类型转换

stringstream通常是用来做数据转换的。相比c库的转换,它更加安全,自动和直接。先来看stringstream的一个实例,基本数据类型转换例子 int转string:

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

int main()
{
    std::stringstream stream;
    std::string result;
    int i = 1000;
    stream << i; //将int输入流
    stream >> result; //从stream中抽取前面插入的int值
    std::cout << result << std::endl; // print the string "1000"
}

wgs2sgf需要将读取的wgs信息转换成为字符串,以方便统一写入sgf文件。利用stringstream,可以完美的实现转换:

#include "wgs.h"

string wgsFile::getmoves(char* filepath)
{
	gethandicap(filepath);
	int start=0;				//标志是否是让子棋 让子棋白棋先行,否则黑棋先行
	moves="";
	if(handicap>0)
	{
		start=1;
		switch(handicap)
		{
		case 2:
			moves="AB[pd][dp]\n";							//让2子(位置在 右上和左下)
			break;
		case 3:
			moves="AB[dd][pd][dp]\n";						//让3子
			break;
		case 4:
			moves="AB[dd][pd][dp][pp]\n";					//让4子
			break;
		case 5:
			moves="AB[dd][pd][dp][pp][jj]\n";				//让5子
			break;
		case 6:
			moves="AB[dd][pd][dp][pp][dj][pj]\n";			//让6子
			break;
		case 7:
			moves="AB[dd][pd][dp][pp][dj][pj][jj]\n";		//让7子
			break;
		case 8:
			moves="AB[dd][pd][dp][pp][jd][dj][pj][jp]\n";	//让8子
			break;
		case 9:
			moves="AB[dd][pd][dp][pp][jd][dj][pj][jp][jj]\n";	//让9子
			break;
		default:
			moves="";
			break;
		}
	}

	read_wgs.open(filepath,ios::in|ios::binary);
	isfileopen(filepath);
	int filesize;
	read_wgs.seekg(0,ios::end);
	filesize=read_wgs.tellg();		//文件大小
	read_wgs.seekg(122,ios::beg);	//指针定位到据文件首部122字节处(对局开始处)
	int* tmp=new int[filesize-122];		//手数信息

	char* b=new char[filesize];		//读取每一手棋 临时变量
	for(int i=122;i<filesize;i++)
	{
		read_wgs.read(&b[i],1);
		tmp[i-122]=(unsigned int)b[i];
	}

	int newline=0;	//sgf文件换行
	stringstream stream;				//类型转换
	string tmpstr="";					//用于类型转换的临时变量

	/*
	 * 97~122对应字母a~z, 列:32对应i,0对应a,4对应b,8对应c,....;97+t[i]/4可以实现0->97,4->98,8->99...的映射,
	 * 行:0->a,1->b,2->c... t[j]+97实现映射;
	 */

	for(int j=0;j<filesize-122;j++)
	{
		if[1]j/2+start)%2==0)		//判断黑白,奇数手为白,偶数手为黑 start标志让子棋
		{
			if(tmp[j]==1&&tmp[j+1]==0)		//pass一手,在wgs对应16进制 01 … Continue reading<<[2]char)(97+tmp[j+1]<<"]";
				stream>>tmpstr;
				moves+=tmpstr;
				stream.clear();			//清空stream内容 否则每次读取的都一样
				stream.str("");
				j++;			//读取了两个字节,需加1
			}
		}
		else
		{
			if(tmp[j]==1&&tmp[j+1]==0)			//pass一手,在wgs对应16进制 01 00,在sgf中对应B[]或者W[]
			{
				tmpstr=";W[]";
				moves+=tmpstr;
				tmpstr="";
				j++;
			}
			else
			{
				stream<<";W["<<[3]unsigned char)(97+tmp[j]/4<<[4]unsigned char)(97+tmp[j+1]<<"]";
				stream>>tmpstr;
				moves+=tmpstr;
				stream.clear();
				stream.str("");
				j++;
			}
		}

		newline++;
		if(newline%14==0)		//14手换一行
			moves+="\n";

	}
	moves+=")";
	delete [] b;
	delete [] tmp;
	read_wgs.close();
	return moves;
}

参考:http://www.cppblog.com/Sandywin/archive/2007/07/13/27984.html

参考资料

参考资料
1 j/2+start)%2==0) //判断黑白,奇数手为白,偶数手为黑 start标志让子棋 { if(tmp[j]==1&&tmp[j+1]==0) //pass一手,在wgs对应16进制 01 00,在sgf中对应B[]或者W[] { tmpstr=";B[]"; moves+=tmpstr; tmpstr=""; j++; } else { stream<<";B["<<((char)(97+tmp[j]/4
2 char)(97+tmp[j+1]
3 unsigned char)(97+tmp[j]/4
4 unsigned char)(97+tmp[j+1]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注