Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >用ifstream加载文件到字符串,加载另一个文件的不完整副本?

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

Stack Overflow用户
提问于 2015-12-29 10: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 10: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

复制
相关文章
如何加载Class文件到JVM
如下图所示,是ClassLoader加载一个class文件到JVM时需要经过的步骤:
MickyInvQ
2020/09/27
1.3K0
如何加载Class文件到JVM
用JavaScript来加载css、js文件
友儿
2023/10/21
2820
类加载器加载Class文件的过程
因为底层硬件的不同,如果在不同硬件上都要做一次适配化无疑是令人奔溃的,如何让代码一次编译,处处运行呢。
燃192
2023/02/28
1.2K0
类加载器加载Class文件的过程
修改lua的文件加载器,自定义lua文件加载
require使用的路径和普通我们看到的路径还有些区别,我们一般见到的路径都是一个目录列表。require的路径是一个模式列表,每一个模式指明一种由虚文件名(require的参数)转成实文件名的方法。更明确地说,每一个模式是一个包含可选的问号的文件名。匹配的时候Lua会首先将问号用虚文件名替换,然后看是否有这样的文件存在。如果不存在继续用同样的方法用第二个模式匹配。例如,路径如下:
帘卷西风
2018/08/03
2.3K0
Class文件的加载过程
resolution:class文件常量池里面的符号引用转换成直接的内存地址 直接能访问到的内容
@派大星
2023/06/28
2150
Class文件的加载过程
android加载dex方法,android Dex文件的加载
上篇文章讲到了apk的分包,通过multidex构建出包含多个dex文件的apk,从而解决65536的方法数限制问题《Android Dex分包》。
全栈程序员站长
2022/09/07
1.9K0
Class文件加载过程
JVM加载Class文件主要分3个过程:Loading 、Linking、Initialzing
烂猪皮
2020/11/02
1.8K0
Class文件加载过程
JavaScript文件加载优化
企鹅号小编
2018/01/04
1.2K0
【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )
在 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 ) 博客中 , 准备了 classes.dex 字节码文件 , 将字节码文件拷贝到了 将 app\src\main\assets\classes.dex 目录中 ;
韩曙亮
2023/03/30
9130
【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )
动态加载JS文件
const scriptEl = document.createElement('script'); scriptEl.onload = scriptEl.onreadystateschange = function () { if (!this.readyState // FF onload || this.readyState == 'loaded' || this.readyState == 'complete' // IE onreadystateschange ) {
路过君
2021/12/07
20.4K0
Js文件异步加载
浏览器中渲染引擎与Js脚本引擎是互斥的,在浏览器开始渲染页面时,如果遇到<script>标签,会停止渲染当前页面,也就是说在脚本加载与执行的过程中会阻塞页面的渲染,在网速较差的环境下可能会出现浏览器页面假死的情况,这也就是尽量将<script>文件放置于<body>后的原因,Js文件异步加载就是使浏览器加载外部Js脚本文件时不阻塞渲染线程,这称为非阻塞模式加载,当然加载完成之后解析执行Js脚本时必须与渲染引擎互斥,解析执行Js脚本的时机取决于异步加载Js的方式。
WindRunnerMax
2020/08/27
10.4K0
sedna加载xml文件
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/46721869
血狼debugeeker
2018/09/20
6920
[Spring Boot] 配置文件加载[超详细]
2、 @PropertySource(value="classpath:props.properties")方式
架构探险之道
2019/07/30
2.4K0
[Spring Boot] 配置文件加载[超详细]
用.env文件为NodeJS加载环境变量
使用环境变量是配置 Node.js 程序的好方法。而且许多包或模块可以基于不同的 NODE_ENV 变量的值表现出不同的行为。
疯狂的技术宅
2021/04/23
9.5K0
用.env文件为NodeJS加载环境变量
资源文件的动态加载
页面加载 首先,浏览器发起直接对目标html的请求,然后分析其中用到的资源并下载,浏览器有自己的规则来判断什么样的资源可以被并行下载,什么样的不可以,浏览器对加载顺序有着特殊的喜好:   JS的出现会延迟后续CSS的下载,因为JS会改变页面元素,浏览器会延迟整个页面的渲染直到JS被下载解释并执行,所以必须让CSS的链接在JS前面以达到尽可能的并行。 与浏览器支持的并发连接数有关 在HTTP 1.1协议中要求浏览器访问同一host的连接数不得大于2,但事实上当前绝大多数浏览器都违背了这一要求,具体参见:并发连
小端
2018/04/16
2.3K0
JVM加载class文件的原理
当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件。那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做【加载 】。加载完成之后,我们就可以进行一系列的运行前准备工作了,比如: 为类静态变量开辟空间,将常量池存放在方法区内存中并实现常量池地址解析,初始化类静态变量等等。这篇文章我们要好好谈谈JVM是如何加载class文件的?
Java架构师历程
2018/09/26
1.2K0
JVM加载class文件的原理
WordPress首页文件的加载顺序
如上排序,如果你主题里面有 front-page.php 文件,那么你后台设置首页是无效的
青梅煮码
2023/01/16
1K0
WordPress首页文件的加载顺序
tensorflow动态加载文件
如果把文件全部加载到内存中,对大数据量来说,是不可行的,tensorflow使用列队,通过多线程来操作队列进出。举例子来说明> tf.train.slice_input_producer是一个tensor生成器,作用是按照设定,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入文件名队列。 下面这个例子是将文件名加入到队列中,每次从列队中只能取出一个tensor,然后读取图片数据,还是频繁io操作, import tensorflow as tf import matplotlib.
用户1733462
2018/06/07
1.3K0
JVM如何加载.class文件
JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。
葆宁
2019/04/18
1.1K0
JVM如何加载.class文件
QUiLoader加载ui界面文件
QUiLoader类允许你动态加载Qt设计的用户界面(ui)文件并创建实例。它加载基于XML的ui文件并实例化,而无需任何C++代码生成或编译。 使用方法 基创建一个QUiLoader实例; 然后调用其load()方法指定.ui文件(可以是文件或Qt资源). 例子 QUiLoader loader; QFile file(":/myForm.ui"); file.open(QFile::ReadOnly); QWidget *widget = loader.load(&file, this); file.c
Qt君
2019/07/15
2.1K0

相似问题

ifstream不加载整个文件

11

如何从ifstream加载LLVM位码文件?

222

Ifstream加载文件失败,无法打开

16

C++ ifstream,用“;;”发出加载。

31

未能读取加载了ifstream的文件

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文