2012-08-27 189 views
1

如何從文件讀取64位無符號整數?我已經將它存儲爲實際的二進制數據,而不是字符串表示。使用fscanf()讀取無符號long long

+4

,那麼你最好使用FREAD然後,而不是fscanf ..因爲這是從字符串中讀取的。 http://www.cplusplus.com/reference/clibrary/cstdio/fread/ – billjamesdev

回答

3

它是如何編碼的?二進制數通常在endianness中有所不同。如果您想假定它與當前主機的字節序相同,則可以直接使用fread。否則,你需要在閱讀後進行字節交換。

獎勵積分,假設你有過怎樣的序列化控制,你說明一些標誌或字節順序標記的字節序。

3

事情是這樣的:

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

uint64_t value; 
if (fread(&value, sizeof value, fp) != sizeof value) { /* error */ } 

// ... 

fclose(fp); 

如果是你是誰寫的數據,這應該工作的開箱。如果數據來自其他地方,請檢查二進制格式的文檔以說明序列化格式與平臺之間的表示差異(例如可能需要進行字節交換)。


一種替代,教學法更多有用的,但效率不高的方法是把數據讀入緩衝區並應用自己的處理。這是更靈活(例如,你可以對付瘋狂的字節排列順序一樣3-2-1-4-7-8-6-5),但大概慢了許多:

unsigned char buf[sizeof uint64_t]; 
if (fread(buf, sizeof buf, fp) != sizeof buf) { /* error */ } 
uint64_t leval = buf[0] + (buf[1] << 8) + /* ... */; 
uint64_t beval = buf[7] + (buf[6] << 8) + /* ... */; 
uint64_t ceval = (buf[0] << 16) + (buf[1] << 8) + buf[2] + (buf[3] << 24) + /* ... */;