How to use fread and fwrite functions to read and write Binary files?

100,204

Solution 1

Open the file with mode w+ (reading and writing). The following code works:

#include<stdio.h>
int main()
{
    FILE *fp = NULL;

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11};
    short result[10];
    int i;

    fp=fopen("temp.bin", "w+");

    if(fp != NULL)
    {
        fwrite(x, sizeof(short), 10 /*20/2*/, fp);
        rewind(fp);
        fread(result, sizeof(short), 10 /*20/2*/, fp);
    }
    else
        return 1;

    printf("Result\n");
    for (i = 0; i < 10; i++)
        printf("%d = %d\n", i, (int)result[i]);

    fclose(fp);
    return 0;
}

With output:

Result
0 = 1
1 = 2
2 = 3
3 = 4
4 = 5
5 = 6
6 = 5000
7 = 6
8 = -10
9 = 11

Solution 2

When you opened the file, you forgot to allow for reading:

fp=fopen("c:\\temp.bin", "wb");

Should be:

fp=fopen("c:\\temp.bin", "w+b");
Share:
100,204

Related videos on Youtube

user1190135
Author by

user1190135

Updated on February 08, 2020

Comments

  • user1190135
    user1190135 about 4 years

    Hi in my project I've to read a .bin file which has sensor data in the form of short(16 bit values). I'm doing this using fread function into a buffer, but I feel that the reading-in is not happening correctly. I mean there is no consistence between what I write and what I read in. Can you guys suggest what is going wrong here? This is not my code from my project... I'm only trying to verify the fread and fwrite functions here.

    #include<stdio.h>
    void main()
    {
        FILE *fp = NULL;
    
        short x[10] = {1,2,3,4,5,6,5000,6,-10,11};
        short result[10];
    
        fp=fopen("c:\\temp.bin", "wb");
    
        if(fp != NULL)
        {
            fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
            rewind(fp);
            fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
        }
        else
            exit(0);
    
        printf("\nResult");
        printf("\n%d",result[0]);
        printf("\n%d",result[1]);
        printf("\n%d",result[2]);
        printf("\n%d",result[3]);
        printf("\n%d",result[4]);
        printf("\n%d",result[5]);
        printf("\n%d",result[6]);
        printf("\n%d",result[7]);
        printf("\n%d",result[8]);
        printf("\n%d",result[9]);
    
        fclose(fp)
     }
    

    After I do the fread() (HEX values):

    temp.bin:
    01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b...
    

    After I do the fwrite()

    stdout:
    Result
    0
    914
    -28
    -28714
    -32557
    1
    512
    -32557
    908
    914
    
    • aardvarkk
      aardvarkk about 12 years
      Have you tried closing and then reopening the file? I'm not sure what the contents of a file are if you write to it and then read to it immediately. You may have to close it first to make sure the data is flushed out? Also, make sure you open it for reading the second time around...
    • Tim Ring
      Tim Ring almost 5 years
      Should really always use 'b' in file mode if you're going to use fread/fwrite. Lots of opportunities for screw ups or odd behavior reading text files. Most implementations do text translation in fread/fwrite but, as i said, this can cause problems (translated CR/LFs can cause more data to be written or less data to be read than you intended). Use fgets/fputs to read/write text files.
  • pmg
    pmg about 12 years
    The mode rwb is not recognized. I think you mean w+b or wb+.
  • pmg
    pmg about 12 years
    Well @Richard: it isn't Standard nevertheless. see here or in this PDF.
  • trojanfoe
    trojanfoe about 12 years
    The 'b' flag is ignored in fopen() under Mac OS X, but not under Microsoft's implementation.