首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用ifstream加载文件到字符串,加载另一个文件的不完整副本?

用ifstream加载文件到字符串,加载另一个文件的不完整副本?
EN

Stack Overflow用户
提问于 2015-12-29 18:18:03
回答 1查看 141关注 0票数 0

很简单,我只是尝试将文件加载到OpenGL着色器的字符串中。我尝试了以下两种方法:

代码语言:javascript
代码运行次数:0
运行
复制
std::string result = "";
std::ifstream stream(path, std::ios::in);
std::string line = "";
while (getline(stream, line))
    result += line + "\n";
stream.close();
return result.c_str();

以及

代码语言:javascript
代码运行次数:0
运行
复制
std::ifstream stream(path, std::ios::in);
std::string result(std::istreambuf_iterator<char>(stream), (std::istreambuf_iterator<char>()));
stream.close();
return result.c_str();

我在我的着色器类中使用了以下方法:

代码语言:javascript
代码运行次数:0
运行
复制
std::string basePath = std::string("shaders/");
std::string vertPath = basePath + name + ".vsh";
std::string fragPath = basePath + name + ".fsh";
const char* vertSrc = loadFile(vertPath.c_str());
const char* fragSrc = loadFile(fragPath.c_str());

我创建了一个着色器,其中name是“标准”,两者都加载良好。然后我再次调用构造函数,但是name是"fxaa“。片段着色器很好地加载,但是像这样加载了fxaa.vsh

代码语言:javascript
代码运行次数:0
运行
复制
#version 330 core

uniform sampler2D sampler;
uniform vec2 fbo_size;

in vec4 frag_color;
in vec2 tex_coord;

layout (location = 0) out vec4 final_color;

void main()
{
    float FXAA_SPAN_MAX = 8.0;
    float FXAA_REDUCE_MUL = 1.0 / 8.0;
    float FXAA_REDUCE_MIN = 1.0 / 128.0;

    vec3 rgbNW = texture(sampler, tex_coord + (vec2(-1.0, -1.0) / fbo_size)).rgb;
    vec3 rgbNE = texture(sampler, tex_coord + (vec2(1.0, -1.0) / fbo_size)).rgb;
    vec3 rgbSW = texture(sampler, tex_coord + (vec2(-1.0, 1.0) / fb

当它应该像这样装载时:

代码语言:javascript
代码运行次数:0
运行
复制
#version 330 core

uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;

layout (location = 10) in vec3 vertex_in;
layout (location = 11) in vec4 color_in;
layout (location = 12) in vec2 tex_coord_in;

out vec4 frag_color;
out vec2 tex_coord;

void main()
{
    gl_Position = projection_matrix * view_matrix *
            model_matrix * vec4(vertex_in, 1.0);
    frag_color = color_in;
    tex_coord = tex_coord_in;
}

片段着色器的顶部看起来就像加载的顶点着色器一样:(第1-21行)

代码语言:javascript
代码运行次数:0
运行
复制
#version 330 core

uniform sampler2D sampler;
uniform vec2 fbo_size;

in vec4 frag_color;
in vec2 tex_coord;

layout (location = 0) out vec4 final_color;

void main()
{
    float FXAA_SPAN_MAX = 8.0;
    float FXAA_REDUCE_MUL = 1.0 / 8.0;
    float FXAA_REDUCE_MIN = 1.0 / 128.0;

    vec3 rgbNW = texture(sampler, tex_coord + (vec2(-1.0, -1.0) / fbo_size)).rgb;
    vec3 rgbNE = texture(sampler, tex_coord + (vec2(1.0, -1.0) / fbo_size)).rgb;
    vec3 rgbSW = texture(sampler, tex_coord + (vec2(-1.0, 1.0) / fbo_size)).rgb;
    vec3 rgbSE = texture(sampler, tex_coord + (vec2(1.0, 1.0) / fbo_size)).rgb;
    vec3 rgbM = texture(sampler, tex_coord).rgb;

我本质上是一个Java程序员,所以我不熟悉C++的IO系统,我确信这是我的ifstream,甚至我的文件,或者整个文件加载程序的一部分,但是我不知道是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-29 18:54:17

这是一个常见的错误,与加载文件的方式无关。这两项声明是唯一相关的:

代码语言:javascript
代码运行次数:0
运行
复制
std::string result = "";
...
return result.c_str();

result是一个对象(类型为string),它在定义堆栈时作为局部变量分配给它。在函数的末尾,它超出作用域,并被销毁,这意味着它包含的字符串数据将被释放。

c_str()方法返回指向string对象的内部存储的指针。一旦字符串被销毁(如上面所示,在函数退出时发生),内部存储就会被释放。结果是,您从c_str()方法获得的结果在此之后无效,因为它指向已释放的内存。

因此,函数返回一个指向已释放内存的指针,该指针可用于其他内存分配。因此,如果您查看返回的内容,该值可以被覆盖,因为内存被其他分配所使用。一些内存分配例程有意覆盖释放的内存,特别是在调试模式下,以使此类错误更加明显。

您需要做的是从方法中返回一个std::string对象,而不是const char*。然后正确地返回值,并将其复制到分配给它的变量中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34516686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档