我目前正在学习 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/