开发者

How to sniff the number of records in a binary file before reading into an array in the C programming language?

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 t开发者_如何学Pythono find out how many records but optimal? */


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).


If you are dealing with an entire file only containing records of fixed size (which seems to be the case), you can use stat to get the total size of the file. stat gets this information from the file system itself and, therefore, you don't need to open the file in advance. On my linux box, this program does the trick:


int main() {

   const char * const filename = "/bin/ls";

   struct stat buf;

   if ( 0 == stat(filename, &buf) ) {
      printf("File: %s - Size: %d\n", filename, buf.st_size);
   }

   return 0;

}

The program above prints the total size of the binary ls. Once you have the total size of the file, all you need to do is to divide it by the size of the struct representing the records. This will give you the total number of records in the file.


What kind of records are they?

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


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?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜