Как прочитать float из двоичного файла в C?
все, что я нахожу через google, - это мусор... Обратите внимание, что я хочу получить ответ на C, однако, если вы дополните свой ответ решением C++а также затем вы получите бонусные очки!
Я просто хочу иметь возможность читать некоторые поплавки в массив из двоичного файла
редактировать: Да, я знаю о endian-Несс... и нет, мне все равно, как он хранился.
7 ответов
Как вы должны читать поплавки из файла полностью зависит от того, как значения были сохранены там в первую очередь. Одним из распространенных способов может быть:
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;
}
float f;
if(read(fd,&f,sizeof(f))==sizeof(f))
printf("%f\n",f);
else
printf("oops\n");
при условии, что он написан как совместимое двоичное представление.
read
для файловых дескрипторов, fread
на FILE*
s и 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)
можно использовать fread операционной. (Обратите внимание, что API предназначен для C, хотя на веб-сайте говорится c++ reference :))
использовать 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));
имейте в виду, что вы можете столкнуться с проблемами endian при передаче файлов между различными архитектурами.
Если файл весь "float" , и вы хотели прочитать его 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
FILE *thisFile=fopen("filename","fb");
float myFloat;
fscanf(thisFile,"%f",&myFloat);
fclose(thisFile);
это работает, если данные записываются с помощью fprintf (конкретной реализации)
, вы можете также typecast ваш поплавок к int32 и сохранить, нагрузить и typecast.
std::fstream thisFile;
thisFile.open("filename",ios::read|ios::binary);
float myFloat;
thisFile>>myFloat;
thisFile.close();
может быть неправильно (я не использовал функции C++ F. IO в течение времени loooong loooong)
Если эти значения последовательно помещаются в двоичный файл, вы можете прочитать sizeof(float) байт на значение float в массив символов. Затем вы можете поместить их в значение float.