Cstring은 모든 노드 정보를 저장하고 Cstring의 노드 정보를 읽습니다.

5598 단어

1 나중에 문서에 저장할 수 있도록 Cstring 변수에 정보 저장
Cstring은 다음과 같은 형식으로 정보를 저장합니다.
2_0_1_3_4
그중 2는 2개의 값이 있음을 나타낸다. 하나는 <0,1>이고 다른 하나는 <3,4>이다.
 
절차는 다음과 같습니다.
			struct Node{

				int nStart;
				int nEnd;
			};

			std::vector<Node>  numInfoVector;

			Node node;

			node.nStart=0;
			node.nEnd=1;
			numInfoVector.push_back(node);

			//...
            //  ...         
			//  ...
			

			//           CString   
			CString content;
			CString temp;

			content.Format(_T("%d"),numInfoVector.size());
			for (int i=0;i<numInfoVector.size();i++)
			{
				temp.Format(_T("_%d_%d"),numInfoVector.at(i).nStart,numInfoVector.at(i).nEnd);
				content+=temp;
			}


			//    content     1_0_1     

 
2 정보를 읽는 방법:
 
잘못된 읽기 방법:
 
왼쪽 첫 번째를 읽고 그 값 n을 얻으면,
그리고 n회 순환, 매번 4자리 절취d_d 
사용stscanf(str,_T("_%d_%d"),&nStart, &nEnd); 읽기
 
분석: 2 의 경우0_1_3_4 이 예, 이 방법으로 읽는 것은 문제없지만, 10보다 큰 숫자에 대해서는 오류가 있다
예: 211_13_22_25  
그 중에서 수학적으로 11은 Cstring에서 두 글자로 취급되기 때문에 처음 4자리를 캡처했을 때 얻은 문자열은 다음과 같다.11_아니d_d의 형식으로 인해 오류가 발생했습니다.
 
정확한 사고방식은 왼쪽에서 오른쪽으로 ''를 끊임없이 찾는 것이다.정확한 분할 위치를 정합니다.
 
다음은 이 형식의 디지털 정보를 정확하게 읽는 프로그램입니다.
 
//content  CString  ,      2_11_13_15_30        
//                



struct PositionNode
{
	int nStart;
	int nEnd;
};

PositionNode node;
std::vector<PositionNode>  PositionVec;

int nStart=0;
nStart=content.Find(_T('_'));
CString numStr;

if (nStart>0)
{
	numStr=content.Left(nStart);
}else{

	AfxMessageBox(_T("content        "));
	return;
}

int num=_ttoi(numStr);

if (num>0)
{
	content=content.Right(content.GetLength()-nStart);//          ,  content       _d_d   
	for (int i=0;i<num-1;i++) 
	{
		nStart=0;
		for (int j=0;j<2;j++)//       _d_d           ‘_’   
		{
			nStart=content.Find(L'_',nStart+1);//  nStart+1    ,  ,        nStart
		}

		numStr=content.Left(nStart); //      _d_d
		_stscanf(numStr,_T("_%d_%d"),&node.nStart,&node.nEnd);
		PositionVec.push_back(node);
	}//      ,    content     _d_d

	_stscanf(content,_T("_%d_%d"),&node.nStart,&node.nEnd);
	PositionVec.push_back(node);
}//     ,             

 
 
또한 문자열에서 포맷된 데이터를 읽는 함수를 소개합니다stscanf()
_stscanf는 문자열에서 서식 적용 데이터를 읽습니다. MSDN의 예는 다음과 같습니다.
 
#include <stdio.h>

int main( void )
{
   char  tokenstring[] = "15 12 14...";
   char  s[81];
   char  c;
   int   i;
   float fp;

   // Input various data from tokenstring:
   // max 80 character string:
   sscanf( tokenstring, "%80s", s ); // C4996
   sscanf( tokenstring, "%c", &c );  // C4996
   sscanf( tokenstring, "%d", &i );  // C4996
   sscanf( tokenstring, "%f", &fp ); // C4996
   // Note: sscanf is deprecated; consider using sscanf_s instead

   // Output the data read
   printf( "String    = %s
", s ); printf( "Character = %c
", c ); printf( "Integer: = %d
", i ); printf( "Real: = %f
", fp ); } Output String = 15 Character = 1 Integer: = 15 Real: = 15.000000

 
 
 
알고리즘을 캡슐화하려면 다음과 같이 하십시오.
 
struct Node{

	int nStart;
	int nEnd;
};

 
1) 모든 노드에 대한 정보를 Cstring으로 저장
 
// CString          
void SaveNodeInfoToCString(const std::vector<Node> &nodeInfoVector,CString &nodeInfoStr)
{

	//Node       
	//nodeInfo    Node    
	//        CString   ,         ,        

	//         
	//   2_1_2_6_8      2        ,          1、2         6、8


	if (nodeInfoVector.size()>0)
	{
		CString nodeTemp; //         
		//        
		nodeInfoStr.Format(L"%d",nodeInfoVector.size());
		for (int i=0;i<nodeInfoVector.size();i++)
		{
			nodeTemp.Format(L"_%d_%d",nodeInfoVector.at(i).nStart,nodeInfoVector.at(i).nEnd);
			nodeInfoStr+=nodeTemp;
		}
	}
}

 
2) Cstring에서 노드 정보 읽기
 
//        nodeInfoStr      : 2_1_2_6_8                  ,           
void ReadNodeInfoFromCString(CString nodeInfoStr,std::vector<Node> &nodeInfoVector)
{
	//    
	nodeInfoVector.clear();

	if (!nodeInfoStr.IsEmpty())
	{

		//      、  
		int num=0;
		Node node;

		int nStart=0;
		CString temp;


		//     
		nStart=nodeInfoStr.Find(L'_');
		if (nStart>0) // temp        2 
			temp=nodeInfoStr.Left(nStart);
		else
			return;
		//     
		num=_ttoi(temp);

		// nodeInfoStr    : _1_2_6_8
		nodeInfoStr=nodeInfoStr.Right(nodeInfoStr.GetLength()-nStart);

		//       
		//      2        ,    num-1                  '_'
		for (int i=0;i<num-1;i++) 
		{
			nStart=0;
			for (int j=0;j<2;j++)
			{
				// nStart+1      
				//       1         _    
				//       ,       _   
				nStart=nodeInfoStr.Find(L'_',nStart+1);
			}

			// temp  _1_2
			temp=nodeInfoStr.Left(nStart);
			_stscanf(temp,_T("_%d_%d"),&node.nStart,&node.nEnd);

			//           
			nodeInfoVector.push_back(node);

			//        ,         
			nodeInfoStr=nodeInfoStr.Right(nodeInfoStr.GetLength()-nStart);
		}

		//  ,nodeInfoStr       _6_8
		_stscanf(nodeInfoStr,_T("_%d_%d"),&node.nStart,&node.nEnd);
		nodeInfoVector.push_back(node);
	}

}

 
 
 
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기