tags:

views:

143

answers:

4

How do I tell in a better way how many records there are in a binary file before I open up the file and read the records into an array for example?

MyFile = fopen("DATA.dat", "rb");
i = 0;
while (feof(MyFile) == 0) {
   fread(&tempReadingRecord,sizeof(tempReadingRecord), 1, file);
     if (feof(MyFile) == 0 {
     i++;
     }
   }
 fclose(MyFile);
}
printf("%d", i); /* does work to find out how many records but optimal? */
+2  A: 

What kind of records are they?

If they are of a fixed length, take the file size, and divide it by the record size.

EvilTeach
+4  A: 

Given that you're apparently dealing with an entire file of records of fixed size, you can seek to the end of the file, get the current position, and divide by the record size. In theory, this has a portability problem (a binary file can contain an arbitrary number of NULs appended to its end) but in practice you won't run into problems on most common systems (AFAIK, that happened primarily on CP/M, which didn't explicitly store a file length, just a number of blocks, so the end of the file was always padded to fill the last block).

BTW, your loop for reading records has a problem -- in fact, almost any loop of the sort while (!feof(file)), or anything similar is virtually guaranteed to work incorrectly (typically it'll "read" the last record twice).

Jerry Coffin
+1 for feof. You should use the return value from the read instead.
Thomas Padron-McCarthy
+4  A: 
figurassa
A: 

If they are fixed size, go with Jerry's solution, otherwise reading em in as you are is about the only way I could think of. BTW, is there going to be a case where you will/won't read the file in based on the number of objects?

zdav