Problem writing int to binary file in C

前端 未结 6 2057
一整个雨季
一整个雨季 2021-01-06 21:11

I need to write data to a binary file using C\'s I/O functions. The following code causes a runtime exception :


#include \"stdio.h\"

int main(int argc,char         


        
相关标签:
6条回答
  • 2021-01-06 21:56

    I think Neil's answer can be improved upon. I realize it's already accepted, so this is just to show some contrast (which is why I didn't just edit his).

    fwrite(&val, sizeof val, 1, fp);
    

    Two improvements:

    • No pointer casting, since it's not necessary in C and can hide errors.
    • Use sizeof directly on the object, since that is what you're passing a pointer to. Makes a lot of sense to me, and is safer than repeating yourself and using the type name.
    0 讨论(0)
  • 2021-01-06 21:56
    #include "stdio.h"
    
    int main(int argc,char* argv[]) {
        FILE *fp = fopen("path_to_file.bin","wb");
        if(fp == NULL) {
            printf("error creating file");
            return -1;
        }
        int val = 4;
        fwrite((const void*)val,sizeof(int),1,fp);
    

    You should supply an address not integer itself.

    Additionaly you should not use the integer in such way:

    1. It may differ in endianess on different computers (as mentioned)
    2. It may differ in size. On really old computers it may be 1 or 2 bytes. On most modern it will be 4 but it may be 8 as well (some 64-bit computers). On some strange architectures it may be even 36 bits. int32_t val = 4; fwrite((const void *)val, 4, 1, fp) should solve the problem.

    You may think that your software will never need to be ported. Well - many designers (software and hardware) made similar assumptions. Sometimes it is too costly to not make them - but in this case it is just a matter of few additional checks.

        fclose(fp);
        return 0;
    }
    
    0 讨论(0)
  • 2021-01-06 22:00

    I also faced this kind of problem. So this is my solution.

    fwrite(val, sizeof(val[0], sizeof(val)/sizeof(val[0]), fp);

    0 讨论(0)
  • 2021-01-06 22:10

    Apparently, I'm, trying to access data at 0x0000004 or something like that.

    int val = 4
    

    There's the issue. fwrite is designed to work with strings, and as such its first input is a pointer, the location of a string in memory. You are passing the value of val directly (4) rather than the address of val to fwrite; however, the memory at 0x00000004 is not valid program memory and thus an error is given.

    To fix this, change this:

    fwrite((const void*)val,sizeof(int),1,fp);
    

    Into this:

    fwrite((const void*)&val, sizeof(int), 1, fp);
    

    The "&" operator indicates the location of val. This would be a valid address in memory.

    0 讨论(0)
  • 2021-01-06 22:11
     fwrite((const void*)val,sizeof(int),1,fp);
    

    should be:

     fwrite((const void*) & val,sizeof(int),1,fp);
    

    BTW, if you don't use the cast, you will get a sensible error message. Casts tend to be used by C (and C++) programmers far more often than they should be - a good rule of thumb is "if it needs a cast, it's probably wrong".

    0 讨论(0)
  • 2021-01-06 22:16

    Adding to Neil's answer: this works when you are reading and writing the file on the same platform. Things can become weird if you are reading/writing across platforms with different endianness.

    0 讨论(0)
提交回复
热议问题