Binary file being written incorrectly

2

Creating the binary file:

#include <stdio.h>

int main(int argc, char const *argv[]) {

  FILE *BIN;
  BIN = fopen ("BIN.bin","wb");

  if (BIN!=NULL)
  {
   for (int i = 1; i <= 100; i++) {
      fwrite( & i,sizeof(i),1,BIN);
    }

    fclose (BIN);
  }
  return 0;
}

Reading the binary file:

#include <stdio.h>

int main(int argc, char const *argv[]) {
char* filename = "BIN.bin";
char x[100];
FILE *fp;
fp = fopen (filename,"rb");

fread(x,sizeof(x),1,fp);


for (size_t i = 0; i <sizeof(x); i++) {
  printf("\n%u",x[i]);
}
fclose (fp);
  return 0;
}

The problem is that the binary contains 3 zeros at each created number, where did I go wrong?

Output:

1
0
0
0
2
0
0
0
3
0
0
0
4
0
0
0
5
0
0
0
6
0
0
0
7
0
0
0
8
0
0
0
9
0
0
0
10
0
0
0
11
0
0
0
12
0
0
0
13
0
0
0
14
0
0
0
15
0
0
0
16
0
0
0
17
0
0
0
18
0
0
0
19
0
0
0
20
0
0
0
21
0
0
0
22
0
0
0
23
0
0
0
24
0
0
0
25
0
0
0
    
asked by anonymous 21.11.2018 / 13:39

1 answer

3

You are writing numbers ( i is int ) as binary and you are reading texts ( x is char[] ) as binary. They are incompatible. You write something to 4 bytes and then have them read (which has only 1 ). Then in low numbers so you will have 1 character with a number and 3 zeros.

C is a weak typing language and allows one data to be read as another.

Usually using fprintf() and fscanf() are more appropriate for working with such binary data. Unless you'd rather do all the treatment. Of course, you can join 4 bytes at a time to create an integer.

In any situation an architecture difference where you have read and recorded will give problem, binary can only be used in the same architecture or if you manage those differences at hand.

It might be useful: How to convert text to number? and Different Views of the Same Variable in C Language .

#include <stdio.h>

int main(int argc, char const *argv[]) {
    char x[4] = { 0, 127, 0, 0 };
    printf("%u\n", *((unsigned int *)x));
}

See running on ideone . And in Coding Ground . Also put it in GitHub for future reference .

    
21.11.2018 / 13:57