Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从文件中读取未签名的短字符?_C++_C_File Io - Fatal编程技术网

C++ 如何从文件中读取未签名的短字符?

C++ 如何从文件中读取未签名的短字符?,c++,c,file-io,C++,C,File Io,我有一个位图图像,我正在分析,我需要能够打开文件并存储第一个未签名的短 我尝试使用FILE和fscanf()完成此操作,但fscanf()总是失败并返回0(成功读取的项目数) FILE*pFile=fopen(文件名->c_str(),“r”); if(pFile==NULL) { cerrAhh!不!fscanf用于文本!%hu将在文件中查找类似“1234”的字符串,而不是实际的字节 使用fread 例如 实际上,请注意结尾,并以二进制打开文件。“rb”在Windows上是安全的。请检查返回码

我有一个位图图像,我正在分析,我需要能够打开文件并存储第一个未签名的短

我尝试使用FILE和fscanf()完成此操作,但fscanf()总是失败并返回0(成功读取的项目数)

FILE*pFile=fopen(文件名->c_str(),“r”);
if(pFile==NULL)
{

cerrAhh!不!fscanf用于文本!
%hu
将在文件中查找类似“1234”的字符串,而不是实际的字节

使用fread

例如


实际上,请注意结尾,并以二进制打开文件。
“rb”
在Windows上是安全的。请检查返回码等。

不要使用像*scanf这样的格式化函数;它们期望数据的字符表示,是*printf函数的补充,后者将值转换为字符表示

unsigned val;
f = fopen (filename, "rb");
if (fread (&val, 1, sizeof (val), f) != sizeof (val))
    // error
最大的警告是文件是如何写入的。如果写入程序的endian不同于其运行的计算机,则应使用显式endian代码:

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
}
unsignedval;
无符号字符buf[2];
f=fopen(文件名,“rb”);
如果(fread(buf,1,sizeof(buf),f)!=sizeof(buf))
//错误
否则{

//val=(buf[0],应该是
无符号字符buf[2];
,和
sizeof buf
而不是
sizeof(val)
。上帝,请拿出#ifdef,这样我就可以升级您的解决方案。文件的字节顺序应该是已知的,而不是由编译时预处理器参数决定的……感谢您的反馈——我同意。只需将文件以网络字节顺序存储,并使用hton和ntohs为您转换。这些都具有自动生成的附加优势lly在编译时为您定义了“做正确的事情”。这不是像读取短码一样读取ASCII格式的数字吗?OP要求将二进制文件的两个字节作为短码读取。
FILE *fp = fopen("foo", "rb");
unsigned short x;
fread(&x, sizeof x, 1, fp);
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
}