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

Все, что я нахожу через Google, является мусором ... Обратите внимание, что я хочу получить ответ в C , однако, если вы дополните свой ответ решением C ++ ну тогда вы получите бонусные баллы!

Я просто хочу иметь возможность читать некоторые числа с плавающей точкой в ​​массив из двоичного файла

РЕДАКТИРОВАТЬ: Да, я знаю о порядке байтов ... и нет, мне все равно, как он хранился.

Ответы [ 7 ]

18 голосов
/ 14 сентября 2009

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

void writefloat(float v, FILE *f) {
  fwrite((void*)(&v), sizeof(v), 1, f);
}

float readfloat(FILE *f) {
  float v;
  fread((void*)(&v), sizeof(v), 1, f);
  return v;
}
5 голосов
/ 14 сентября 2009
float f;
if(read(fd,&f,sizeof(f))==sizeof(f))
    printf("%f\n",f);
else
    printf("oops\n");

При условии, что оно написано как совместимое двоичное представление.

read для файловых дескрипторов, fread для FILE* с и istream::read для c++ iostreams. Выберите то, что вам нравится:

read(fd,&f,sizeof(f))==sizeof(f)

fread(&f,sizeof(f),1,fp)==1

fin.read((char*)&f,sizeof(f)).gcount()==sizeof(f)
3 голосов
/ 14 сентября 2009

Вы можете использовать Фред . (Обратите внимание, что API предназначен для C, хотя на сайте написано C ++:)

2 голосов
/ 14 сентября 2009

Если файл «плавает» и вы хотите прочитать его X раз, все, что вам нужно сделать, это:

FILE *fp;

if((fp=fopen("filename.whatever", "rb"))==NULL)
 return 0;

fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);

float *f = (float *)malloc(sizeof(float)*size);
if(f==NULL)
{
 fclose(fp);
 return 0;
}

if(fread(f, sizeof(float), size, fp)!=size)
{
 fclose(fp);
 return 0;
}

fclose(fp);

// do something with f
2 голосов
/ 14 сентября 2009

Используйте fread() из <stdio.h>. Утверждения должны быть заменены фактическим кодом обработки ошибок.

#include <stdio.h>
#include <assert.h>

#define countof(ARRAY) (sizeof (ARRAY) / sizeof *(ARRAY))

float data[5];

FILE *file = fopen("foo.bin", "rb");
assert(file);

size_t n = fread(data, sizeof(float), countof(data), file);
assert(n == countof(data));

Имейте в виду, что при переносе файлов между различными архитектурами могут возникнуть проблемы с порядком байтов

1 голос
/ 14 сентября 2009
FILE *thisFile=fopen("filename","fb");
float myFloat;
fscanf(thisFile,"%f",&myFloat);
fclose(thisFile);

Это работает, если данные записываются с использованием fprintf (зависит от реализации)
Однако, вы также можете типизировать ваш float в int32 и сохранять, загружать и типизировать.

std::fstream thisFile;
thisFile.open("filename",ios::read|ios::binary);
float myFloat;
thisFile>>myFloat;
thisFile.close();

Может быть неправильно (я не использовал функции C ++ F.IO в течение долгого времени)

0 голосов
/ 14 сентября 2009

Если эти значения последовательно помещаются в двоичный файл, вы можете выполнить чтение байтов sizeof (float) на значение с плавающей точкой в ​​массив символов. Затем вы можете привести их к значению с плавающей точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...