【问题标题】:ofstream operator<< access violation errorofstream 运算符<< 访问冲突错误
【发布时间】:2013-12-04 11:35:59
【问题描述】:

我有一个为 Linux 编写的小应用程序,现在已移植到 Windows。它是单线程的并使用 boost(如果重要的话)。
应用程序正在尝试使用以下代码写入文本文件:

m_oFile.open(oFileName.c_str());
if(!m_oFile.is_open())
{
    cerr << "Unable to open output file: " <<  oFileName.c_str() << endl;
    exit(0);
}

m_oFile << "some text goes here\n";

m_oFile 是该类的成员。
文件创建并成功打开;在上面的最后一行代码中抛出异常。

堆栈跟踪:

msvcr100.dll!_lock_file(_iobuf * pf)  Line 236 + 0xa bytes  C   
App.exe!std::basic_filebuf<char,std::char_traits<char> >::_Lock() Line 310 + 0xf bytes  C++   
App.exe!std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base(std::basic_ostream<char,std::char_traits<char> > & _Ostr)  Line 93 + 0x30 bytes    C++
App.exe!std::basic_ostream<char,std::char_traits<char> >::sentry::sentry(std::basic_ostream<char,std::char_traits<char> > & _Ostr)  Line 114 +  x3a bytes   C++

谢谢!

编辑:

当我将代码生成属性更改为使用多线程调试 Dll (/MDd) 而不是多线程 Dll (/MD) 时,一切运行正常。你对此有什么解释吗?
再次感谢。

【问题讨论】:

  • 您的文件是否被其他脚本使用?文件是否具有正确的权限?
  • @rursw1 刚刚看到你的帖子,因为我在使用 Visual Studio 2012 时遇到了同样的问题。对我来说 /MDd 没有帮助,但从 /Od /Ob0/Od /Ob1 确实有帮助。 std::ostream::sentry 中的某些东西似乎很奇怪。我将它调试到发现堆栈上的指针损坏的地步,但我承认我找不到根本原因。 sentry 的一般问题请参阅 hereherehere

标签: c++ windows access-violation ofstream visual-studio-2010


【解决方案1】:

哦 - 库噩梦的 msvc 不兼容 - 是的,请确保所有(!)库相互匹配。

  • 没有混合调试一个版本
  • 不混合单线程和多线程
  • ...

【讨论】:

  • 使用 GCC 等其他编译器会更好吗?
【解决方案2】:

查看here 并尝试以读/写模式打开您的文件。

m_oFile.open(oFileName.c_str(), ios::out | ios::in);

否则,请检查文件的权限。

编辑

请记住始终在最后关闭您的文件。

m_oFile.close();

另一个问题:可以从另一个线程使用该文件吗?

【讨论】:

  • 谢谢,但读/写模式不是问题。权限没问题,文件创建成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多