首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从文件中读取8位原始数据

如何从文件中读取8位原始数据
EN

Stack Overflow用户
提问于 2019-04-20 02:42:42
回答 2查看 348关注 0票数 0

我有一个8位原始数据,表示一个灰度图像(int值为0-255),文件如下:

代码语言:javascript
复制
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 001c 354d 6576 8797
9fa4 a7a4 864b 252e 5973 7673 7b86 7e6d
6164 6c7a 8b98 a2ac b8bd ae96 857f 6d40
1d14 160b 0000 0000 0000 0000 0000 0000

我需要读取它们并打印它们的int值(0-255)。我试了一下,但所有的结果看起来像这样:002000a00 2000 2000 2000我不知道是什么问题,fopen as二进制文件可以吗?

代码语言:javascript
复制
FILE * pFile;
pFile = fopen(inFileName.c_str(), "rb");
if (pFile==NULL){
    cerr << "erro" << endl;
}

uint8_t bufferImmagine[height*width];
fread(bufferImmagine,1,height*width,pFile);

fclose (pFile);
for (int i = 0; i < height*width; ++i)
{
   cout << bufferImmagine[i] << " ";
}
EN

回答 2

Stack Overflow用户

发布于 2019-04-20 09:37:27

因此,bufferImmagineuint8_t类型的数组,而在许多平台上,uint8_tunsigned char的别名。当您将unsigned char流式传输到std::cout中时,流将其视为字符,而不是数字。

如果要将每个字节打印为数字0-255,请将每个字节转换为更广泛的整数类型,如unsigned

代码语言:javascript
复制
std::cout << static_cast<unsigned int>(bufferImmagine[i]) << " ";
票数 0
EN

Stack Overflow用户

发布于 2019-04-20 13:42:33

我在代码中看到了一些潜在的问题:

1)正如评论中提到的,uint8_t bufferImmagine[height*width];是有问题的,因为C++不支持可变长度数组,所以除非可以将heightwidth转换为编译时常量,否则最好使用std::vector (或者,如果您对数据结构敏感,可以使用new运算符分配一个数组,但如果您不非常小心,则有泄漏内存的风险)。

2)根据widthheight的值,bufferImmagine的大小可能非常大;可能大于可用堆栈空间量。使用std::vector或在堆上分配的另一个原因。

3)您永远不会检查fread()调用的返回值,以查看它是否读取了所有数据。它读取的字节数可能比您要求它读取的字节数少(很可能是因为您正在读取的文件不够长),但是如果不检查这个值,您就不会知道出了什么问题,所以如果/当发生错误时,您会非常困惑。

4)正如Jack C.在他的回答中提到的,cout可能会打印出uint8_t的ASCII码字符,而不是整数,这不是您在这里想要的。

5)这不是什么问题,但是如果你希望输出的行对应于文件中的像素行,那么你需要在每个“行”的末尾应用回车符。例如:

代码语言:javascript
复制
int i = 0;
for (int y = 0; y < height; y++)
{
   for (int x = 0; x < width; x++)
   {
      const unsigned int iVal = bufferImmagine[i];
      cout << iVal << " ";
      i++;
   }  
   cout << endl;
}  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55766359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档