无法使用 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,恰好是着色器中的行数。

我猜这与换行对话有关。以二进制文件打开文件,差异应该会消失。