簡體   English   中英

如何從C中的二進制文件中讀取浮點數?

[英]How to read a float from binary file in C?

一切我通過谷歌發現是垃圾...請注意,我想 C中的答案,但是如果你用C ++解決方案補充你的答案,以及那么你獲得積分!

我只是想能夠從二進制文件中讀取一些浮點數到一個數組中

編輯:是的我知道Endian-ness ...而且我不在乎它是如何存儲的。

如何從文件中讀取浮點數完全取決於值的保存方式。 一種常見的方式可能是:

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::readc++輸入輸出流。 選擇你喜歡的東西:

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 ++參考:))

使用<stdio.h> fread() 斷言應該用實際的錯誤處理代碼替換。

#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問題。

如果文件全部“浮動”並且您想要讀取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(特定於實現)編寫數據,則此方法有效
但是,您也可以將您的float類型轉換為int32並保存,加載和類型轉換。

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

可能是錯的(我沒有使用C ++ F.IO函數來表示loooong loooong時間)

如果將這些值按順序放入二進制文件中,則可以將每個浮點值的sizeof(float)字節讀取到字符數組中。 然后,您可以將它們轉換為浮點值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM