2009-11-23 44 views
4

我有一個位圖圖像,我解析,我需要能夠打開文件並存儲第一個unsigned short。如何從文件中讀取unsigned short?

我試圖使用FILE和fscanf()完成此操作,但fscanf()總是失敗並返回0(成功讀取的項目數)。

FILE *pFile = fopen (fileName->c_str() , "r"); 

if (pFile == NULL) 
{ 
    cerr << "couldn't open file ; exiting..." << endl; 
    exit(0); 
} 

unsigned short seed; 
fscanf (pFile, "%hu", &seed); 

有誰知道我可以採取的另一種方法(可能ifstream?)或者可能只是給我一些指針?任何幫助將不勝感激。

謝謝。

回答

12

不要使用格式化函數,如* scanf;他們期望數據的字符表示,即將數值轉換爲字符表示的* printf函數的補充。

unsigned val; 
f = fopen (filename, "rb"); 
if (fread (&val, 1, sizeof (val), f) != sizeof (val)) 
    // error 

最大的問題就是文件的寫法。如果作家的字節順序是比這個運行在計算機不同,則顯式端的代碼應該使用:

unsigned val; 
unsigned char buf[2]; 
f = fopen (filename, "rb"); 
if (fread (buf, 1, sizeof (buf), f) != sizeof (buf)) 
    // error 
else { 
// val = (buf [0] << 8) | buf [1]; // for big endian written file 
    val = (buf [1] << 8) | buf [0]; // for little endian written file 
} 
+2

這應該是'unsigned char buf [2];'和sizeof buf'而不是'sizeof(val)'。 – caf 2009-11-23 03:21:15

+0

上帝請把#ifdef拿出來,這樣我就可以升級你的解決方案。文件的字節順序應該是已知的,不是由編譯時預處理器參數決定的... – 2009-11-23 05:16:50

+0

感謝您的反饋 - 我同意。 – wallyk 2009-11-23 05:55:05

1
std::ifstream input("inputfile.txt"); 
unsigned short value; 
input >> value; 
+0

這難道不是讀的ASCII格式的數字,好像它是一個短? OP要求讀取二進制文件的兩個字節作爲短文。 – 2014-12-14 13:25:47

3

啊!沒有! fscanf是爲文本! %hu將在文件中尋找像「1234」這樣的字符串,而不是實際的字節!

使用fread。

E.g.

FILE *fp = fopen("foo", "rb"); 
unsigned short x; 
fread(&x, sizeof x, 1, fp); 

的確,請注意字節順序,然後以二進制打開文件。 "rb"在Windows上是安全的。檢查返回代碼等。