C++ 从C++;输出奇怪的字符

C++ 从C++;输出奇怪的字符,c++,C++,我是初学者 我只是写了一些简单的代码来读取一个文件,它(某种程度上)正在工作: 但是:无论我做什么,我都会在输出的末尾得到“²” 这是我的文件读取代码: std::string MSEshaderprogram::readFile(const std::string& filepath) { std::ifstream file{ filepath, std::ios::ate | std::ios::binary }; if

我是初学者

我只是写了一些简单的代码来读取一个文件,它(某种程度上)正在工作:
但是:无论我做什么,我都会在输出的末尾得到“²”

这是我的文件读取代码:

std::string MSEshaderprogram::readFile(const std::string& filepath)
    {

        std::ifstream file{ filepath, std::ios::ate | std::ios::binary };
        
        if (!file.is_open())
        {

            MSEdebug::getInstance().debugError("Failed to open: " + filepath);

        }

        size_t fileSize = static_cast<size_t>(file.tellg());
        std::vector<char> buffer(fileSize);

        file.seekg(0);
        file.read(buffer.data(), fileSize);
        file.close();
        
        MSEdebug::getInstance().debugPassthrough(buffer.data());
        MSEdebug::getInstance().debugPassthrough("---------------------------------------------------------");

        std::string output = buffer.data();

        return output;

    }
已经提前感谢您的回答了

std::string output = buffer.data();
因为数据不是以null结尾的,所以输出字符串的格式不正确。使用同样采用长度的构造函数,即

std::string output(buffer.data(), buffer.size());

或者,确保缓冲区以null结尾(将其大一个字节,并将最后一个字节设置为0)

考虑这一行发生了什么

std::string output = buffer.data();
buffer.data()

最好的方法是
std::string(const char*)
——将指针指向以null结尾的C字符串

但是
std::vector
不是以null结尾的,因此
字符串
会“跑掉”超过数据的末尾,在碰巧包含0的随机位置停止

您应该以其他方式构造字符串,例如:

std::string output{begin(buffer), end(buffer)};

或者直接读入
字符串

std::ostringstream sstr;
sstr << file.rdbuf();
return sstr.str();
std::ostringstream sstr;

sstr为什么要以二进制而不是文本形式打开文件?您可能应该null终止您的数据…使用大小为file\u size+1的缓冲区,然后执行buffer[file\u size]='\0'嘿,您是否介意编辑此文件,以便它还显示您必须进行哪些更改才能不读取二进制(从代码中删除std::ios::binary)“我想那样的话答案会更完整。”无须者:我知道是我写的评论,但我不确定这是不是一个问题。它是?如果你在我的答案中单独使用这个建议,而不删除二进制文件,那么它不起作用吗?不,很遗憾,它不起作用。这真的很奇怪,因为如果我只使用你的方法,那就行不通了。如果我只删除二进制文件,它就不起作用了。但是,如果我删除二进制文件并使用你的答案,那么它就可以工作了。非常感谢你的答案,尽管直接读取字符串对于我将来需要的函数来说是不可行的,但是你在这里展示的所有不同选项都让人惊讶:D
std::string output{buffer.data(), buffer.size()};
std::ostringstream sstr;
sstr << file.rdbuf();
return sstr.str();