c++ - 使用 ifstream.read(buf, length) 读取文件 - 接收损坏的数据(大多数情况下)

标签 c++ file stream

我目前正在学习 C++ 和 OpenGL。现在我正在尝试将完整的文件读入 C 样式字符串(准确地说,我尝试读取的文件包含 GLSL 着色器的源代码)。

假设有以下代码:

std::streamoff get_char_count(const char *path) {
    auto file = std::ifstream(path);
    file.seekg(0, std::ios::end);
    return file.tellg();
}

char *read_all_text(const char *path) {
    auto file_size = get_char_count(path);
    auto file = std::ifstream(path);
    auto buf = new char[file_size];
    file.read(&buf[0], file_size);
    return buf;
}

文件内容:

#version 330 core
out vec4 color;

void main() {
    color = vec4(0.35, 0.35, 1, 1);
}

调用read_all_text(),我希望收到与上述完全相同的文件内容。但是,我得到了文件内容,而且在大多数情况下,还有一些乱码的附件:

#version 330 core
out vec4 color;

void main() {
    color = vec4(0.35, 0.35, 1, 1);
}
ar

我怀疑我不小心读到了相邻的内存。但是,查看 get_char_count() 的源代码,我希望获得文件中正确的字符数 - 我确认文件中的字符仅为 ASCII 字符。

我是否遗漏了一些明显的东西?

PS:我更愿意继续使用 char[] 缓冲区方法,因为它似乎是最有效的选项(而不是使用迭代器或 rdbuf )。

最佳答案

您必须以空值终止 C 字符串。该文件末尾没有 '\0',因此不会从字段中读取,但 C 字符串必须以 '\0' 终止:

auto buf = new char[file_size + 1];
file.read(buf, file_size);
buf[file_size] = '\0';

关于c++ - 使用 ifstream.read(buf, length) 读取文件 - 接收损坏的数据(大多数情况下),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73595176/

相关文章:

c++ - 为什么可以相对于非 volatile 访问对这种 volatile 访问进行重新排序?

c++带有缩进的自定义输出流

javascript - 读取大文件和splitby方法

c++ - 错误 : no matching function for call to 'Subclass::...'

c++ - GCC 上虚拟继承行为的奇怪默认空构造函数

c++ - 一个类中的多个可能的模板

java - 为复制的文件生成文件名

c++ - static_cast<char*> 和 (char*) 之间的区别

java - 发现 File.mkdirs() 失败的原因

java - 未分配变量的 PrintWriter 在使用后会关闭吗?