I have a small sample program written in C. I have a main function that calls the writeFile function, which writes some numbers in a binary file. Then I call overwrite to replace 0 with 1, and finally print the result.
This is the code:
#include <stdio.h> /* Print the content of the file */ void printFile(){ printf("Read test.dat:\n"); int r; FILE* fp = fopen("test.dat", "rb+"); if(fp) { while(fread(&r,sizeof(int),1,fp)){ printf("%d\n", r); } } fclose(fp); } /* Replace 0 with 1 */ void overwrite(){ int r; FILE *fp = fopen("test.dat", "rb+"); if (fp) { int i=0; while (i < 4 && fread(&r, sizeof(int), 1, fp)) { i++; if (r == 0) { r = 1; fseek(fp,-sizeof(int),SEEK_CUR); fwrite(&r,sizeof(int),1,fp); } } } fclose(fp); } /* Create original file */ void writeFile() { int b, b1, b2, b3, b4; b = 3; b1 = 2; b2 = 0; b3 = 4; FILE *fp = fopen("test.dat", "wb"); if (fp) { fwrite(&b, sizeof(int), 1, fp); fwrite(&b1, sizeof(int), 1, fp); fwrite(&b2, sizeof(int), 1, fp); fwrite(&b3, sizeof(int), 1, fp); } fclose(fp); } int main() { writeFile(); printf("---------BEFORE--------\n"); printFile(); printf("-----------------------\n"); printf("Overwriting...\n"); overwrite(); printf("---------AFTER---------\n"); printFile(); return 0; }
This code works with Linux, but when I run the same code on Windows, the output is as follows:
---------BEFORE-------- Read test.dat: 3 2 0 4 ----------------------- Overwriting... ---------AFTER--------- Read test.dat: 3 2 1 2
Not only 0 was replaced by 1, but the last number has changed. Can someone help me understand why this is happening?
Another problem is that in overwrite I have to use i to stop this time, because without i<4 I get an infinite loop (only with Windows).
I tested this code on Windows 8.1 compiled with gcc 4.8.1 (from MinGW). On my Linux machine, I tested the code using gcc 5.1.1.
Thanks everyone