2009-11-23 118 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上是安全的。检查返回代码等。