Как использовать feof для считывания неопределенного числа значений с плавающей запятой из двоичного файла?

#c #file #floating-point #binaryfiles #eof

Вопрос:

Я записываю некоторые значения с плавающей точкой в двоичный файл, а затем хочу прочитать их обратно с помощью другой .c программы.

Вот как я их пишу:

 #include lt;stdio.hgt;  int main() {  /* Create the file */  float x = 1.1;  FILE *fh = fopen ("file.bin", "wb");  if (fh != NULL) {  for (int i = 0; i lt; 10;   i)  {  x = 1.1*i;  fwrite (amp;x,1, sizeof (x), fh);  printf("%fn", x);  }  fclose (fh);  }   return 0; }  

И вот как я хочу их прочесть:

 #include lt;stdio.hgt;   int main(){  /* Read the file back in */    FILE *fh = fopen ("file.bin", "wb");    float x = 7.7;  fh = fopen ("file.bin", "rb");  if (fh != NULL) {    while(!feof(fh)){  if(feof(fh))  break;    fread (amp;x, 1, sizeof (x), fh);  printf ("Value is: %fn", x);  }      fclose (fh);  }   return 0; }  

Но я вернул 7.7, что означает, что читатель так и не нашел ни одного из значений.

Как я могу это сделать? Что я здесь пропустил?

Ответ №1:

Во второй программе FILE *fh = fopen ("file.bin", "wb"); откройте файл для записи и урежьте его до нулевой длины, уничтожив содержащиеся в нем данные. Измените это на FILE *fh = fopen ("file.bin", "rb"); и удалите позже fh = fopen ("file.bin", "rb"); .

Кроме того, не используйте feof для проверки наличия дополнительных данных в файле. feof сообщает только о том, произошел ли EOF или ошибка при предыдущей операции чтения или записи. Это не говорит вам о том, что индикатор положения файла в данный момент указывает на конец файла, если не было предпринято никаких попыток прочитать его. Вместо этого проверьте возвращаемое значение fread , чтобы узнать, сколько элементов оно прочитало.

Если вы используете size_t result = fread(amp;x, 1, sizeof (x), fh); , вы просите fread прочитать sizeof (x) байты, и он вернет количество прочитанных байтов. Если это меньше , чем sizeof (x) , то полное x не было прочитано. В отличие от этого, если вы используете size_t result = fread(amp;x, sizeof x, 1, fh); , вы просите fread прочитать 1 объект размера sizeof x . Затем fread будет возвращено количество прочитанных полных объектов, которое будет равно 0 или 1.