Monday 15 July 2019

C reading binary files










If I write an array to the output file and I close the file, then open the file again and read everything until end-of-file is reached, although the file contains only 4 number, the program will read and print 5 numbers, why?




Program output:



a[0] = 4
a[1] = 7
a[2] = 12
a[3] = 34
a[4] = 34


save.bin (with a hex editor)




04000000 07000000 0C000000 22000000





#include 
#include
#define path "save.bin"


int main(void)
{
FILE *f=NULL;
int a[]={4,7,12,34},i,n=4,k;
f=fopen(path,"wb");
if(f==NULL)
{
perror("Error");
exit(1);
}

for(i=0;i fwrite(&a[i],sizeof(int),1,f);
fclose(f);
f=fopen(path,"rb");
if(f==NULL)
{
perror("Error");
exit(1);
}
i=0;

while(!feof(f))
{
fread(&k,sizeof(int),1,f);
printf("a[%d] = %d\n",i,k);
i++;
}
printf("\n");
fclose(f);
return 0;
}


Answer



feof(fp) becomes false (i.e. non-zero value) only if you tried to read past the end of file. That should explain why the loop is entered one more than what you expect.



From the documentation:



  The function feof() tests the end-of-file indicator for the stream
pointed to by stream, returning nonzero if it is set. The end-of-
file indicator can be cleared only by the function clearerr().



Also read the post: Why is “while ( !feof (file) )” always wrong?


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...