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