2012-11-15 22 views
0

我有一個方法,從文件路徑創建一個MatLab數組名稱並將其作爲一個std ::字符串返回。結果字符串被傳入另一個將名稱寫入文件的方法。當我嘗試獲取傳入字符串的長度時,如果字符串的長度爲12或13個字符,它將顯示0。C + + std ::字符串長度()或大小()不工作的方法參數

我的代碼:

bool MyClass::masterMethod(std::string fileURI){ 

FILE* dataStream; 
// Assume dataStream is set up correctly 

// Get arrayName from File URI 
std::string arrayName = this->makeArrayNameFromPath(fileURI); 

//Write array name to file 
this->writeArrayName(arrayName , dataStream) 



} 


std::string MyClass::makeArrayNameFromPath(std::string filePathURI){ 


std::string tempString = filePathURI.substr(filePathURI.find_last_of('/')+1); 

std::string returnString = ""; 

long index = 0; 

for(long i = 0; i < tempString.length(); i++){ 

    if((tempString[i] != ' ') && (tempString[i] != '.')){ 

     returnString[index++] = tempString[i]; 
    } 
} 

return returnString; 

} 



void MyClass::writeArrayName(std::string name , FILE *nameStream){ 

// long testLength = name.length(); 
// long testLength2 = name.size(); 
// const char* testChar = nam.c_str(); 
// long testCharLen = strlen(testChar);  

// The size of the name is the number of Chars * sizeof(int8_t) 
int32_t sizeOfName = (int32_t)(name.length() * sizeof(int8_t)); 
int32_t nameType = miINT8; 

fwrite(&nameType , sizeof(int32_t) , 1 , nameStream); 
fwrite(&sizeOfName, sizeof(sizeOfName), 1, nameStream); 
fwrite(&name , sizeof(name[0]), sizeOfName , nameStream); 

} 

所以我不知道爲什麼字符串長度::不工作。如果創建一個std :: string test = name,並打印它,我可以獲取該字符串的值,但無法獲取其長度或大小。 如果我使用const char * testName = name.c_str();長測試= strlen(testName),我得到了正確的值,但認爲這不是必需的。

所以,任何意見或建議表示讚賞。

+1

你的數據是錯的。如果'length'返回0,那麼你有一個空字符串。該庫沒有錯誤 - 您的代碼確實如此。 –

+0

你的代碼是否看起來像這樣? PLZ增強格式,這使得我的眼睛流血... –

+0

開始將您的字符串作爲常量引用傳遞,因爲複製可能很昂貴。 – ipc

回答

4

returnString[index++] = tempString[i];不會做你認爲它做的事。它不會爲字符串添加額外的空間或長度,只會覆蓋字符串實際上不擁有的位置的內存。我認爲returnString.append(1, tempString[i])或類似的應該做到這一點。

+0

糟糕你的權利!我從來沒有定義新字符串的大小。這將解釋它。 – Miek

1

你永遠不會給字符串一個大小,只是試圖分配不在那裏的位置。

試試這個字符到返回值

returnString += tempString[i]; 
+0

謝謝你突出顯示這一點。我可能在其他一些地方犯了同樣的錯誤,需要去狩獵來糾正它。 – Miek