2015-07-11 47 views
0

這段代碼不斷在我嘗試檢索的字符串前面投擲一個空格。C++ getline在字符串開頭添加空格

void Texture_Manager::LoadSheet(std::string filename, std::string textfile) 
{ 
std::ifstream infofile(textfile); 

if (infofile.is_open()) 
{ 
    std::string line; 
    while(std::getline(infofile, line)) 
    { 
     std::string texturename; 
     sf::IntRect texture; 

     texture.height = 32; //these will be dynamic based on what the text file defines as the pixel sizes 
     texture.width = 32; 
     if(line.find("<name>") != std::string::npos) 
     { 
      std::size_t pos1 = line.find("<name>") + 6; //Search for the name of the texture 
      std::size_t pos2 = line.find(";", pos1); 
      std::size_t namesize = pos1 - pos2; 
      texturename = line.substr(pos1, namesize); 
      std::cout << texturename << std::endl; 


     } 
    } 
} 

這是我正在閱讀的文件。我試圖獲得這個名字,它一直在沙漠和草地上放置一個空間。

<collection>tilemapsheet; 
<ratio>32; 
<name>desert; <coords>x=0 y=0; 
<name>grass; <coords>x=32 y=0; 
+0

如果任何人有更好的建議,如何做到這一點以及我會很感激任何建設性的批評。我基本上搜索某個單詞,然後讀取信息以設置sfml中的紋理 – Joshua

+3

您確定該空間沒有被前面的「cout」調用輸出嗎?另外(不相關的),你應該把',pos1'放在你搜索的末尾;'''如果前面有一個'

+0

這是我的代碼中的第一個cout調用。謝謝你的提示。它爲沙漠和草地提供了一個空間。它在沙漠之後立即打印草而不會離開while循環。 – Joshua

回答

0

由於pos1是< pos2,所以pos1-pos2的結果是負數。由於這是存儲在size_t類型的變量中的,所以它是一個無符號整數,它變成了一個巨大的正數。
substr正在被大量調用作爲第二個參數。在這種情況下,標準說「如果字符串更短,儘可能多的字符被使用」。我認爲這裏有一些不明確的地方,不同的實現可能會導致不同的行爲。

http://www.cplusplus.com/reference/string/string/substr/

讓我們POS1和POS2的打印值,看看發生了什麼。

 std::size_t pos0 = line.find("<name>"); 
     std::size_t pos1 = line.find("<name>") + 6; //Search texture 
     std::size_t pos2 = line.find(";", pos1); 
     std::size_t namesize = pos1 - pos2; 

     std::cout << pos0 << ", " << pos1 << ", " << pos2 << ", " << namesize << std::endl; 

     texturename = line.substr(pos1, namesize); 
     std::cout << "texturename: " << texturename << std::endl; 

在我的情況,我有以下值

0, 6, 12, 18446744073709551610 
texturename: desert; <coords>x=0 y=0; 
0, 6, 11, 18446744073709551611 
texturename: grass; <coords>x=32 y=0; 

當我嘗試(POS2 - POS1),我得到了正常的預期行爲。

0, 6, 12, 6 
texturename: desert 
0, 6, 11, 5 
texturename: grass 
+0

所以我切換了pos1和pos2變量。不知道我是怎麼搞砸的......但由於某種原因,現在pos2變成了一個非常大的正數。我不明白爲什麼要麼 – Joshua

+0

好,所以這是因爲找到pos2它的值的函數返回爲'std :: string :: npos'我不完全確定爲什麼。 – Joshua

+0

......這是因爲我在添加分號後從未保存過文本文件。感謝幫助我的愚蠢錯誤= P。有沒有更好的方法來做到這一點? – Joshua