小编Eba*_*sin的帖子

在ostream上使用std :: endl使我的文件成为二进制文件

我正在开发一个使用libzip的项目.我在c ++ 14工作,我在libzip周围写了一个小包装,让我的生活更轻松.

我有一个std::ostream围绕自定义类继承的对象std::streambuf.此streambuf使用libzip函数写入存档中的文件.

一切都很好,直到我使用std::endl.当我这样做时,输出文件被我的所有文本阅读器读取为二进制文件(仅写入字符串).

我的文本阅读器检测到它的二进制文件,因为在我使用的地方std::endl有一个NUL字节,任何带有NUL字节的文件都被视为二进制文件.

所以我的问题是:这是正常的吗?我有办法使用std::endl吗?

我的代码(提取它可能不完全相同).

source.hpp

// my attributes
std::unique_ptr<zip_source_t, std::function<void(zip_source_t*)>> _source;
std::unique_ptr<std::ostream> _stream;
std::unique_ptr<_ZipBuffer> _buffer;

class _ZipBuffer : public std::streambuf {
    private:
        zip_source_t* _source;

        std::streamsize xsputn(char const* s, std::streamsize n) override;
        int overflow(int c) override;

    public:
        _ZipBuffer(zip_source_t* file);
};
Run Code Online (Sandbox Code Playgroud)

source.cpp

// create the streambuf and send it to the ostream
_buffer.reset(new _ZipBuffer(_source.get()));
_stream.reset(new std::ostream(_buffer.get()));

// the implementation of _ZipBuffer
Zip::Source::_ZipBuffer::_ZipBuffer(zip_source_t* source) {
    _source = source;
} …
Run Code Online (Sandbox Code Playgroud)

c++ ostream streambuf libzip c++14

5
推荐指数
1
解决办法
344
查看次数

在 OpenGL 上下文之间同步资源时是否需要调用 glFinish?

我在我的应用程序中使用了两个 OpenGL 上下文。

第一个用于渲染数据,第二个用于后台加载和生成 VBO 和纹理。

当我的加载上下文生成一个 VBO 并将其发送到我的渲染线程时,我在我的 VBO 中得到无效数据(全零),除非我调用glFlushglFinish在加载上下文上创建 VBO 之后。

我认为这是由于我的加载上下文没有任何缓冲区交换或任何告诉 GPU 开始在其命令队列上工作并且什么都不做的东西(这导致渲染上下文端的 VBO 为空)。

从我所见,这种刷新在 Windows 上不是必需的(用 Nvidia GPU 测试,即使没有刷新也能工作),但在 linux/macOS 上是必需的。

苹果文档上的这个页面说调用glFlush是必要的(https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESApplicationDesign/OpenGLESApplicationDesign.html

如果您的应用程序在多个上下文之间共享 OpenGL ES 对象(例如顶点缓冲区或纹理),您应该调用 glFlush 函数来同步对这些资源的访问。例如,您应该在一个上下文中加载顶点数据后调用 glFlush 函数,以确保其内容已准备好被另一个上下文检索。

但是调用glFinish还是glFlush必要的,或者是否有更简单/更轻松的命令可用于实现相同的结果?(这是必要的,glFlush还是glFinish?)

另外,是否有文档或参考文献讨论过这个问题?我找不到任何提及,并且在实现之间的工作方式似乎有所不同。

opengl vbo openglcontext

5
推荐指数
1
解决办法
201
查看次数

错误 C1903 - 调用 offsetof 时无法从以前的错误中恢复

在 MSVC 上编译项目时出现奇怪的错误。

我正在使用 Microsoft Visual Studio 15 2017 并在 c++17(MSVC 版本 15.6.85.37198)中编译

代码在 Clang 和 G++ 上编译,但在 MSVC 上给我一个错误。

我设法将导致错误的代码减少到以下代码段:

#include <cstddef>

struct Point {
    double x;
    double y;
    double z;
};

template<class... Ps>
void doSomething() {
    offsetof(Point, x);
}

int main() {
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

main.cpp(10): fatal error C1903: unable to recover from previous error(s); stopping compilation [build\example.vcxproj]
Run Code Online (Sandbox Code Playgroud)

起初我有点困惑,因为这是唯一的错误,我花了很长时间才确定问题来自 offsetof。

问题来自offsetof在接受参数包的模板化函数中使用宏。

我认为这段代码没有做任何非法的事情或使用未定义的行为。那么,是我的问题还是编译器中的错误?

谢谢

c++ visual-studio c++17

4
推荐指数
1
解决办法
1626
查看次数

标签 统计

c++ ×2

c++14 ×1

c++17 ×1

libzip ×1

opengl ×1

openglcontext ×1

ostream ×1

streambuf ×1

vbo ×1

visual-studio ×1