Как узнать количество записей в двоичном файле перед чтением в массив на языке программирования C? - PullRequest
2 голосов
/ 30 ноября 2009

Как мне лучше узнать, сколько записей в двоичном файле, прежде чем я открою файл и, например, прочитаю записи в массив?

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? */

Ответы [ 4 ]

6 голосов
/ 01 декабря 2009

Учитывая, что вы, очевидно, имеете дело с целым файлом записей фиксированного размера, вы можете перейти к концу файла, получить текущую позицию и разделить на размер записи. Теоретически, это проблема переносимости (двоичный файл может содержать произвольное число NUL, добавленных в его конец), но на практике вы не столкнетесь с проблемами в большинстве распространенных систем (AFAIK, которые случались в основном в CP / M, который явно не хранит длину файла, просто количество блоков, поэтому конец файла всегда заполняется, чтобы заполнить последний блок).

Кстати, у вашего цикла чтения записей есть проблема - на самом деле практически любой цикл такого рода while (!feof(file)) или что-то подобное практически гарантированно работает неправильно (обычно он «читает» последнюю запись дважды) .

4 голосов
/ 01 декабря 2009

Если вы имеете дело с целым файлом, содержащим только записи фиксированного размера (что, кажется, имеет место), вы можете использовать stat, чтобы получить общий размер файла. stat получает эту информацию из самой файловой системы, поэтому вам не нужно открывать файл заранее. На моем linux box эта программа делает свое дело:


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;

}

Программа, приведенная выше, печатает общий размер двоичного файла ls. Когда у вас есть общий размер файла, все, что вам нужно сделать, это разделить его на размер структуры, представляющей записи. Это даст вам общее количество записей в файле.

2 голосов
/ 30 ноября 2009

Что это за записи?

Если они имеют фиксированную длину, возьмите размер файла и разделите его на размер записи.

0 голосов
/ 01 декабря 2009

Если они фиксированного размера, воспользуйтесь решением Джерри, иначе чтение их в том виде, в каком вы есть, - это единственный способ, о котором я могу подумать. Кстати, будет ли случай, когда вы будете / не будете читать файл в зависимости от количества объектов?

...