Я пытаюсь сделать следующее
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 — это значения, содержащиеся внутри структуры, и эта структура отправляется как событие другому процессу, который извлекает эти значения.
Проблема, с которой я сталкиваюсь, это когда я делаю
str.flush()
после строки № 6 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;
};
использование str.clear()
сбросить поток строк после строки 6.
Увидеть Проблема с повторным использованием объекта stringstream
Я думаю, что вам нужно перемотать поток перед извлечением данных из него:
str.seekg(0, std::ios::beg);