user2980746
user2980746

Reputation: 381

Trying to understand fread

I have a datafile.

#version 460 core
out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}

And I am trying to read the contents of it with fread.

    FILE *fshader;
    char *fbuffer;
    long fsize;

    fshader = fopen("src/graphics/_fragment.shader", "r");

    fseek(fshader, 0L, SEEK_END); 
    fsize = ftell(fshader); 
    rewind(fshader);

    fbuffer = (char *)malloc(fsize + 1);
    fread(fbuffer, 1, fsize, fshader); 
    fbuffer[fsize] = '\0';

But I don't understand how fread works. It keeps reading 6 characters more than it should.

#version 460 core
out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}_to_te

Upvotes: 4

Views: 117

Answers (2)

Konstantin Makarov
Konstantin Makarov

Reputation: 1366

There are 2 possible solutions:

  1. Either specify that the file has a binary format (to save \r characters):
fshader = fopen("src/graphics/_fragment.shader", "rb");
  1. Either put the 0-terminator in the position obtained after reading (to ignore \r characters):
size_t _fsize;
_fsize = fread(fbuffer, 1, fsize, fshader);
fbuffer[_fsize] = '\0';

Upvotes: 2

Andreas Wenzel
Andreas Wenzel

Reputation: 24726

My guess is that you are on Microsoft Windows and that the text file has \r\n line endings.

On Microsoft Windows, when reading the character combination \r\n in text mode, it will get translated to \n. However, when at the end of the file, ftell will give you the length of the file in untranslated bytes, even when in text mode. This means that as far as fread is concerned, your file has a length that is a few bytes shorter than reported by ftell.

For this reason, you should set the position of the terminating null character according to the number of bytes read by fread, by inspecting the return value of fread. You should not set it according to what ftell reported.

Upvotes: 5

Related Questions