这里是初学者。
我只是写了一些简单的代码来读取文件,它(有点)工作:
但是:无论我做什么,我都会在输出的末尾得到“²”。
这是我的文件读取代码:
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);
}²²²²
---------------------------------------------------------
已经提前感谢您的回答。
答案 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();