C++ 如何从文件中读取未签名的短字符?
我有一个位图图像,我正在分析,我需要能够打开文件并存储第一个未签名的短 我尝试使用FILE和fscanf()完成此操作,但fscanf()总是失败并返回0(成功读取的项目数)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*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
}