从 C++ 中的文件读取输出奇怪的字符

时间:2021-04-02 19:36:11

标签: c++

这里是初学者。

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

这是我的文件读取代码:

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;

    }

这是我查看调试输出时得到的输出: (是的,我正在尝试读取顶点着色器)

#version 330 core

layout (location = 0) in vec3 aPos;

void main()
{
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}²²²²
---------------------------------------------------------

已经提前感谢您的回答。

2 个答案:

答案 0 :(得分:1)

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

因为数据不是以空字符结尾的,所以您的输出字符串的格式不正确。使用同样需要长度的构造函数,即

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

或者,确保缓冲区是空终止的(通过将其增大一个字节并将最后一个字节设置为 0)

答案 1 :(得分:1)

想想这条线上会发生什么

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

buffer.data() 返回一个 char *,它需要匹配 std::string 构造函数之一。

最好的方法是 std::string(const char*) - 使用指向以空字符结尾的 C 字符串的指针。

但是 std::vector<char> 不是以空值结尾的,因此 string 在数据末尾“跑掉”,停在一个恰好包含 0 的随机位置。

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

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

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

或者直接读入string

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