English 中文(简体)
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 to 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
", 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?





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签