为什么C++字符串擦除函数在stringstream声明和初始化时无法正常工作?

qij5mzcb  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(120)

我做了一个简单的程序,我正在阅读一个文本文件,它和程序在同一个文件夹中,文件只有一行:" v 1.0 2.0 3.0" .

问题:

当我用字符串line初始化一个stringstream示例ss时,我使用erase()函数试图从字符串中删除字符'v',但它不起作用。MSVC控制台显示了同一行字符串:

如果删除.erase(0,1)函数,输出是相同的。
这是怎么发生的?它应该删除字符v。我通过OpenGL的对象加载器教程了解到这一点,他们可以删除它。

代码

#include <sstream>
#include <fstream>
#include <iostream>

int main()
{
    std::ifstream filestream("textfile.txt", std::ios::in);
    std::string line = "";

    while (!filestream.eof())
    {
        std::getline(filestream, line);
        std::cout <<"getline std::string "<< line.c_str()<<std::endl;
        std::stringstream ss(line.erase(0,1));
        std::cout << "stringstream: " << ss.str() << std::endl;
    }
}
rqqzpn5f

rqqzpn5f1#

经过一些测试,我找到了原因。我犯了一个低级错误。我应该使用一个文本编辑器,可以显示所有隐藏的空格。
看起来自从stringstream ss的初始化以来,有一个空字符。如果我再删除一个字符,就可以了。

int main()
{
    std::ifstream filestream("textfile.txt", std::ios::in);
    std::string line;

    while (!filestream.eof())
    {
        std::getline(filestream, line);
        std::cout <<"getline std::string"<< line.c_str()<<std::endl;
        std::stringstream ss(line.erase(0,2));
        
        std::cout << "stringstream:" << ss.str() << std::endl;
    }
}

有没有可能是opengl书的作者打错了?他们用erase(0,1)表示顶点数据的“v”,然后用erase(0,2)表示面数据的“f
这就是不使用好的文本编辑器的错误

相关问题