C ++ getline在字符串的开头添加空格

时间:2015-07-11 04:55:47

标签: c++ fstream

这段代码不断在我试图检索的字符串前面抛出一个空格。

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;

1 个答案:

答案 0 :(得分:0)

因为pos1是&lt; pos2,pos1 - pos2的结果是负数。由于它存储在size_t类型的变量中,这是一个unsigned int,因此它变成了一个巨大的正数   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