【问题标题】:Ifstream fails for unknown reasonIfstream 因未知原因失败
【发布时间】:2012-11-04 20:19:55
【问题描述】:

我有一个用于将 pgm 文件格式读取到内存的函数的问题。

我使用了以下链接 http://www.cse.unr.edu/~bebis/CS308/Code/ReadImage.cpp 中的来源。您可以在同一目录中找到其他人;以及 CS308 中的一些说明;如果你有兴趣。

问题是 ifstream ifp 失败;我认为这段代码可能是原因;但我觉得很好。

任何想法将不胜感激

charImage = (unsigned char *) new unsigned char [M*N];

 ifp.read( reinterpret_cast<char *>(charImage), (M*N)*sizeof(unsigned char));

 if (ifp.fail()) {
   cout << "Image " << fname << " has wrong size" << endl;
   exit(1);
 }

【问题讨论】:

  • 当您说“ifp 失败”时,您的意思是它打印“图像 fname 大小错误”吗?
  • 是的;它是 。我最怀疑这段代码;因为图像的所有参数都是正确的;我检查了。
  • 你永远不会打开ifp的实际文件。
  • 否;我不 。恐怕整个函数太长了,这里就不全部复制了。您可以查看我提供的链接。 cse.unr.edu/~bebis/CS308/Code/ReadImage.cpp
  • 文件一点也不长。

标签: c++ memory-management binary ifstream pgm


【解决方案1】:

问题是您的输入文件格式不正确。它应该有足够的数据来填充 charImage,但它没有,这就是它失败的原因。另一种可能是您尝试在 windows 上运行此代码,并且需要以二进制模式打开文件。

具体(对于二进制部分)更改:

 ifp.open(fname, ios::in);

到:

 ifp.open(fname, ios::in | ios::binary);

顺便说一句,转换 new 运算符的结果通常是不合适的。在这里,它只是多余的,没有任何意义。

【讨论】:

  • 好吧;我认为文件格式没有问题。我用 irfanview 打开它,似乎没有任何问题。我也尝试了几张图片;不止一个。 AFAIK ;使用强制转换是因为灰度值 (0-255) 需要 unsigned char ;但 ifstream::read 需要 char 才能工作
  • 你没有抓住重点。当您使用new unsigned char 时,它已经是unsigned char *。将其转换为 unsigned char * 是多余的。另外,你有没有试过我建议的第二部分,即你需要以二进制模式打开它?
  • 啊;我得到它 。现在就试试。谢谢:)
【解决方案2】:

任何使用reinterpret_cast&lt;...&gt;() 的东西在我看来都是可疑的,至少可以这么说。不过,这可能不是问题的根源。我个人的猜测是问题的根源是在 Windows 机器上运行代码而不是以二进制模式打开文件。尝试使用

std::ifstream in("filename", std::ios_base:::binary);

由于打开文件的代码不是问题的一部分,所以这只是一个疯狂的猜测。

【讨论】:

  • 我会试试你的建议。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多