ifstream构造函数返回一个损坏的对象

时间:2013-09-15 13:45:40

标签: c++

我有这段代码:

std::string ff = "C:\\res\\pp.txt";
std::ifstream test(ff);
if(test.is_open())
{
    std::string s;
    std::getline(test, s);

}

如果我在构造中放置断点并分析测试对象,则构造它,但缓冲区是一个不正确的指针。然后,getline崩溃,因为测试已损坏。

作为辅助信息,此代码将执行到与某些库链接为gameplay3d的项目中。

一些想法?

编辑:这是堆栈跟踪:

  

msvcp100d.dll!std :: _ Xfiopen(const char * filename,int mode,int prot)Línea85C ++       msvcp100d.dll!std :: _ Fiopen(const char * filename,int mode,int prot)Línea94+ 0x11字节C ++       sample-browser.exe!std :: basic_filebuf> :: open(const char * _Filename,int _Mode,int _Prot)Línea220+ 0x1d Bytes C ++       sample-browser.exe!std :: basic_ifstream> :: basic_ifstream>(const std :: basic_string,std :: allocator>& _Str,int _Mode,int _Prot)Línea725+ 0x1f Bytes C ++       sample-browser.exe!Audio3DSample :: initialize()Línea30+ 0x15字节C ++

在代码命中_Xfiopen之前,所有似乎都没问题。此时,未创建fp,虽然创建了ifstream,但内部文件缓冲区为空。如果我把这个代码放在另一个项目中,它就可以工作,更重要的是,构造函数调用的代码和堆栈是完全不同的。

2 个答案:

答案 0 :(得分:2)

您对问题的描述听起来好像您正在使用一个标准C ++库的标头,但是来自另一个不兼容的实现的实现。在许多情况下,设置的东西应该是链接失败,但不能防止在所有情况下链接不兼容的库。我会验证标头是否与实际实现相匹配。

答案 1 :(得分:0)

首先不要在ifstream中传递字符串,使其成为const char * type。

 std::ifstream test(ff.c_str());