gpt4 book ai didi

c++ - 字符串流相关问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:22 26 4
gpt4 key购买 nike

我正在尝试执行以下操作

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

a 和 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;
};

最佳答案

在第 6 行之后使用 str.clear() 重置字符串流。

参见 Problem with re-using a stringstream object

关于c++ - 字符串流相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com