2013-11-25 47 views
2

我尝试做以下字符串流相关的问题

std::stringstream str; 
string string1, string2; 
long a = 23343; 
long b = 323234; 
str << std::hex << a; 
str >> string1;  //line no. 6 
str << std::hex << b; 
str >> string2;  //line no.8 

一个& b的包含在结构内部的价值观和这个结构被发送作为事件的其他过程,提取这些值。 我遇到的问题是,当我6号线后做

str.flush() 

,该string string1是空的,空string传递给其他进程。

有没有什么办法可以将stringstream str用于不同的值?

下面是实际的代码 -

void* CIAppDiagService::SendDidValue(void *arg) 
{ 

DiagService::SReadDIDResponse didResponse; 
didResponse.ComponentId = ::DiagService::eComponentMin; //Todo 
didResponse.bStatus=false; 
didResponse.nDIDCode=((CIAppDiagService*)arg)->mDIDCode; 


if(didResponse.nDIDCode == 0xD95C) 
{ 
    ::CIApplicationManager::UUIDList_var aUidList; 
    //get uuid list 
    AppMgrServerData::getAppMgrServerData()->AppDirectory().getList(aUidList.out()); //fills the UUIDList which is a sequence of string 

    if(aUidList->length() > 0) 
    { 
     std::string aAppDetails,aAppVersion,aAppVersionString,aAppIDString,NumberOfAppsInstalledString; 
     AppId aAppId; //typedef long AppId 
     CORBA::ULong ulength = aUidList->length(); 
     std::stringstream stream,stream1,stream2; 
     short int iAppVersion; 
     aAppDetails.append("000000ff"); 
     short int iNumberOfAppsInstalled = AppMgrServerData::getAppMgrServerData()->AppDirectory().getTotalAppsInstalled(); // returns and integer 
     stream << std::hex << iNumberOfAppsInstalled; 
     stream >> NumberOfAppsInstalledString; 
     stream.clear(); 
     if(1 == NumberOfAppsInstalledString.length()) 
     { 
      NumberOfAppsInstalledString = "000" + NumberOfAppsInstalledString; 
     } 
     else if(2 == NumberOfAppsInstalledString.length()) 
     { 
      NumberOfAppsInstalledString = "00" + NumberOfAppsInstalledString; 
     } 
     else if(3 == NumberOfAppsInstalledString.length()) 
     { 
      NumberOfAppsInstalledString = "0" + NumberOfAppsInstalledString; 
     } 
     strcat(const_cast<char*>(aAppDetails.c_str()),NumberOfAppsInstalledString.c_str()); 

     for(int count = 0; count< aUidList->length(); count++) 
     { 
         aAppId = AppMgrServerData::getAppMgrServerData()->AppDirectory().getApplicationAppIDByUid((aUidList[count])); 
      aAppVersion = AppMgrServerData::getAppMgrServerData()->AppDirectory().getAppVersion(string(aUidList[count])); 


      stream1 << std::hex << aAppId % (std::numeric_limits<uint16_t>::max()+1); 


      stream1 >> aAppIDString; //convert aAppID into string 

      stream1.clear(); 

      strcat(const_cast<char*>(aAppDetails.c_str()),aAppIDString.c_str()); 
      TRACE(cout<<"check 1"<<endl); 
      iAppVersion = atoi(aAppVersion.c_str()); 
      stream2 << std::hex << aAppVersion; 
      TRACE(cout<<"CIAppDiagService::: SendDidValue::: aAppVersion stream = "<< stream2 << endl); 
      stream2.seekg(0, std::ios::beg); 
      stream2 >> aAppVersionString; 

      stream2.clear(); 

//The following is some restriction/implementation that i need to follow. 

      if(1 == aAppVersionString.length()) 
      { 
       aAppVersionString = "000" + aAppVersionString; 
      } 
      else if(2 == aAppVersionString.length()) 
      { 
       aAppVersionString = "00" + aAppVersionString; 
      } 
      else if(3 == aAppVersionString.length()) 
      { 
       aAppVersionString = "0" + aAppVersionString; 
      } 
      strcat(const_cast<char*>(aAppDetails.c_str()),aAppVersionString.c_str()); //aAppVersion concatenated 

     } 
     int length = strlen(aAppDetails.c_str()) + 1; 
     if(length) 
     { 
      didResponse.DIDValue.length(length); 
      for(int i=0; i < length; i++) 
      { 
       didResponse.DIDValue[i]=aAppDetails[i]; 
       cout<<" CIAppDiagService::SendDidValue:: didResponse.DIDValue[i]"<<didResponse.DIDValue[i]<<endl; 
      } 
     // didResponse.DIDValue[length] = '\0'; 
      didResponse.bStatus = true; 
     } 
     else 
     { 
      char errResult[]={0x7F,0x22,0x22}; //error codes from media team/to be changed 
      didResponse.DIDValue.length(3); 
      didResponse.bStatus=false; 

      for(int i=0; i<3; i++) 
      { 
       didResponse.DIDValue[i]=errResult[i]; 
      } 
     } 
      ((CIAppDiagService*)arg)->SendEvent_ResponseDidValue(didResponse); 
    } 
    else 
    { 
     cout<<" No applications installed/No AppIDs found. "<<endl; 
    } 
} 

return 0; 

}

void CIAppDiagService::SendEvent_ResponseDidValue(DiagService::SReadDIDResponse didResponse) 
{ 
TRACE(cout<<"CIAppDiagService::entered in Send_Event Response"<<endl); 
CosNotification::StructuredEvent event; 
event.header.fixed_header.event_type.domain_name = CORBA::string_dup(DiagService::gDiagnosisServiceDomain); 
event.header.fixed_header.event_name = CORBA::string_dup(DiagService::gReadDIDEventName); 
event.header.variable_header.length(0); // put nothing here 
event.filterable_data.length(0); 

DiagService::SReadDIDResponse *tmp = new DiagService::SReadDIDResponse; 
if (tmp != NULL) { 
    tmp->ComponentId = didResponse.ComponentId; //TODO 
    tmp->DIDValue = didResponse.DIDValue; 
    tmp->bStatus = didResponse.bStatus; 
    tmp->nDIDCode = didResponse.nDIDCode; 

    event.remainder_of_body <<= *tmp; 
    TRACE(cout<<"CIAppDiagService::SendEvent_ResponseDidValue:: calling send event"<< endl); 
    mCIDiagSupplier->send_event(event); 
} 

TRACE(cout<<"CIAppDiagService::exited from Send_Event Response"<<endl); 

}

的想法是所有字符串连接成一个字符串appDetails和填充结构成员SReadDIDResponse.DIDValue 这里是结构SReadDIDResponse

struct SReadDIDResponse { 
EComponent ComponentId; //enum values 
TID nDIDCode;    // integer 
OctetSeq DIDValue;  //octet sequence 
boolean bStatus; 
}; 
+0

你不显示与你的代码一起使用'flush'。它没有工作吗? – crashmstr

+0

@ crashmstr--没有先生。没有冲洗,同样的事情仍然存在。 – user2559758

+0

为什么不''string1 = str.str()'? – HAL

回答

0

我认为你需要从中提取数据之前倒带流:

str.seekg(0, std::ios::beg); 
1

使用str.clear()行后的字符串流重置6

Problem with re-using a stringstream object

+0

明确也不起作用。我已经尝试过了。 – user2559758

+0

@ user2559758然后你可以发布代码_could_ _reproduce_你的问题?更详细的描述。你现有的代码可以正常工作,至少在我的笔记本电脑上增加了'str.clear()'。 – starrify

+0

清除重置错误状态标志: – user2559758