我正在尝试从zip文件中加载着色器源,这是一个用记事本创建的纯文本文件。加载代码如下(从下面的代码片段中删除错误检查代码):
std::string retrievestringfromarchive(std::string filename)
{
//data is the zip resource attached elsewhere
unz_file_info info;
Uint8* rwh;
unzLocateFile(data, filename.c_str(), NULL);
unzOpenCurrentFile(data);
unzGetCurrentFileInfo(data, &info, NULL, 0, NULL, 0, NULL, 0)
rwh = (Uint8*)malloc(info.uncompressed_size);
unzReadCurrentFile( data, rwh, info.uncompressed_size );
//garbage at end of file
const char* rwh1 = reinterpret_cast<char*>(rwh);
std::stringstream tempstream(rwh1);
std::string tempstring = tempstream.str();
free(rwh);
return tempstring;
}
返回的字符串输出如下:
//FRAGMENT SHADER
#version 120
//in from vertex shader
varying vec2 f_texcoord;
varying vec4 f_color;
uniform sampler2D mytexture;
void main(void)
{
gl_FragColor = texture2D(mytexture, f_texcoord) * f_color;
}
//endfile««««««««îþîþ
注意:
我检查了信息结构,压缩和未压缩的大小都匹配来自7zip的信息
当用gdb检查时,缓冲区“rwh”本身有垃圾字符
我在Win7 64bit上,使用代码块和TDM-GCC-32 4.8.1编译
“// endfile”注释可以很好地避免gl shader编译问题,但是必须要这样做。
答案 0 :(得分:0)
rwh = (Uint8*)malloc(info.uncompressed_size); unzReadCurrentFile( data, rwh, info.uncompressed_size );
我非常怀疑unzReadCurrentFile
在缓冲区中添加了0
终止符 - 无论如何都没有空格 - 而且你正在使用指针作为0
- 终止的字符串。
如果将缓冲区解释为字符串确实有意义,可以这样做:
std::string tempstring(rwh1, info.uncompressed_size);
答案 1 :(得分:0)
解压缩程序为您提供了一个解压缩数据块 - 但它不知道数据是纯文本,并且您打算将其用作C语言字符串。因此它不会在末尾添加终止NUL(零)字符。就这样。只需复制给定数量的字符,并且不要假设数据块是零终止的。