在 seekg() 上读取文件时崩溃

Posted

技术标签:

【中文标题】在 seekg() 上读取文件时崩溃【英文标题】:Crash on reading file on seekg() 【发布时间】:2013-10-20 10:04:33 【问题描述】:

我正在尝试将 bmp 文件读入字符缓冲区并使用进程间通信将其跨进程传输。我使用以下代码完成了此操作:

     std::ifstream ImageFile;
     char* str=new char[strlen(pFilePath)+strlen(pFileName)+1];
     strcpy(str,pFilePath);
     strcat(str,pFileName);
     ImageFile.open(str, ios::binary); 
     if(ImageFile.is_open())
         ImageFile.seekg(0,ios::end);
         m_uiImageSize = ImageFile.tellg();
         ImageFile.seekg(0,ios::beg);

         m_pcImageBuffer = new char[m_uiImageSize];
         ImageFile.read(m_pcImageBuffer,m_uiImageSize);
         ImageFile.close();
     

     WebCore::FloatRect rect;
     BITMAP cBitmap;
     HBITMAP hBitmap;
     tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)m_pcImageBuffer;
     tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(m_pcImageBuffer+sizeof(tagBITMAPFILEHEADER));
     RGBQUAD             rgb = *(RGBQUAD*)(m_pcImageBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER));

     BITMAPINFO bi;
     bi.bmiColors[0] = rgb;
     bi.bmiHeader = bih;

     char* pPixels = (m_pcImageBuffer+bfh.bfOffBits);
     char* ppvBits;
     hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0);
     SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS);
     GetObject(hBitmap, sizeof(BITMAP), &cBitmap);

这对我以前很有效。但是现在我的程序在 ImageFile.seekg(0,ios::end) 崩溃了,我不知道为什么。该文件可以正常打开,甚至 ifstream::good() 返回 true。以下是我的调用堆栈:

StorageTree.exe!std::use_facet >(const std::locale & _Loc) 第 586 行 C++ msvcp110d.dll!std::basic_istream >::_Sentry_base::_Sentry_base(std::basic_istream > & _Istr) 第 103 行 C++ msvcp110d.dll!std::basic_istream >::sentry::sentry(std::basic_istream > & _Istr, bool _Noskip) 第 123 行 C++ msvcp110d.dll!std::basic_istream >::seekg(__int64 _Off, int _Way) 第 876 行 C++

请指导我正确的方向。

【问题讨论】:

【参考方案1】:

找到了我的问题的解决方案。代码没有任何问题,我在应用程序中添加了更多代码,并且没有初始化我的一些变量,从而影响了入口点和数据位置。

【讨论】:

你能说得更具体点吗?我遇到了同样的问题,使用 seekg() 或 getline() 或任何导致“访问冲突”的东西。并且文件已打开且有效。

以上是关于在 seekg() 上读取文件时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

c++中ifstream一次读取整个文件

“seekp”和“seekg”可以互换吗?

“seekp”和“seekg”可以互换吗?

如何在 Ubuntu 12.04 上读取崩溃文件?

C++ Ifstream 读取太多?

程序在 C++ 中尝试从文件中读取内容时崩溃 [关闭]