无法使用 fseek() 和 fread() 正确读取整个文件
Unable to read the entire file correctly using fseek() and fread()
我有一个包含着色器源的文件,我想阅读它,它看起来像这样:
#version 460 core
layout(location = 0) in vec2 pos;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 fragColor;
uniform float rand;
out gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
};
void main()
{
fragColor = color * rand;
gl_Position = vec4(pos.x + 0.5 * gl_InstanceID, pos.y, 0, 1);
}
首先我找出我的文件的大小:
fseek(m_file, 0L, SEEK_END);
size_t size = ftell(m_file);
This returns 364。问题是,如果我只是将文件内容复制+粘贴到 R"()"
字符串中并得到一个 strlen,它 returns 347。
获取文件大小后,我尝试读取整个文件:
fseek(m_file, 0, SEEK_SET);
size_t count = fread(buffer, 1, size, m_file);
其中 buffer
分配了 364 字节。但是 fread returns 347 和 feof(m_file) returns 是真的。结果我得到了这个:
(文件资源管理器也显示文件大小为 364)。
但是,当我使用 std::ifstream
将同一个文件读入字符串时,一切正常:
std::ifstream ifs(filename);
std::string content((std::istreambuf_iterator<char>(ifs)),
(std::istreambuf_iterator<char>()));
auto size = content.size();
并且size
等于347。
问题是:我是做错了什么还是 Windows/fseek 只是错误地显示了文件大小?
两种尺寸之间的差异是 19,恰好是着色器中的行数。
我猜这与换行对话有关。以二进制文件打开文件,差异应该会消失。
我有一个包含着色器源的文件,我想阅读它,它看起来像这样:
#version 460 core
layout(location = 0) in vec2 pos;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 fragColor;
uniform float rand;
out gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
};
void main()
{
fragColor = color * rand;
gl_Position = vec4(pos.x + 0.5 * gl_InstanceID, pos.y, 0, 1);
}
首先我找出我的文件的大小:
fseek(m_file, 0L, SEEK_END);
size_t size = ftell(m_file);
This returns 364。问题是,如果我只是将文件内容复制+粘贴到 R"()"
字符串中并得到一个 strlen,它 returns 347。
获取文件大小后,我尝试读取整个文件:
fseek(m_file, 0, SEEK_SET);
size_t count = fread(buffer, 1, size, m_file);
其中 buffer
分配了 364 字节。但是 fread returns 347 和 feof(m_file) returns 是真的。结果我得到了这个:
(文件资源管理器也显示文件大小为 364)。
但是,当我使用 std::ifstream
将同一个文件读入字符串时,一切正常:
std::ifstream ifs(filename);
std::string content((std::istreambuf_iterator<char>(ifs)),
(std::istreambuf_iterator<char>()));
auto size = content.size();
并且size
等于347。
问题是:我是做错了什么还是 Windows/fseek 只是错误地显示了文件大小?
两种尺寸之间的差异是 19,恰好是着色器中的行数。
我猜这与换行对话有关。以二进制文件打开文件,差异应该会消失。