R6025和std :: locale

时间:2015-02-02 23:09:04

标签: c++ c++11

我一直在努力使用一些非常简单的代码来将std :: wstring写入文件。根据对stackoverflow的一些研究,建议我在读取和写入之前设置文件的语言环境。

 typedef std::codecvt_utf8<wchar_t> ConverterType;
 ConverterType converter;

 // open a file in read mode.
 std::wifstream readFile;

 // pass in the current locale of the file and the converter
 std::locale wloc(readFile.getloc(), &converter); //"en_US.UTF-8");

 // imbue the file with the locale
 readFile.imbue(wloc);

 readFile.open(m_absoluteFilePath, std::ios::in | std::ios::binary);

 if (!readFile.is_open())return false;

 // read the data from the file
 readFile >> readString;

 // close the opened file.
 readFile.close();

以上导致R6025错误的纯虚函数调用。我找到了一个在线答案,建议如下。

http://forums.codeguru.com/showthread.php?457106-Unicode-text-file

从页面复制并粘贴 - &#34;我收到了消息&#34; Runtim错误!程序:...... R6025 - 纯虚函数调用

原因是流的析构函数再次访问已经被破坏的构面。  您可以通过在创建流之前移动构面的创建来修复代码。&#34;  ...

 null_wcodecvt wcodec(1);
 std::locale wloc(std::locale::classic(), &wcodec);
 std::wfstream file;
 file.imbue(wloc);

我认为这正是我的问题,因为当我完全删除loc代码并且只是对文件进行读写操作时没有错误。问题是我无法弄清楚如何在wifstream声明之前移动wloc声明,因为wloc是使用readFile.getloc()构建的。这对我来说似乎有点鸡蛋和鸡蛋的情况?

这样做的正确方法是什么?对我来说,这种顺序的依赖性似乎没有得到很好的记录,这似乎也很奇怪?

(另外请注意,我正在读取和写入json字符串到文件。我的理解是使用std :: ios :: binary来简化json字符串中的所有转义字符?也许这是不真实的可怜的选择,因为我无法测试它,但我想解释我在上面使用std :: ios :: binary的选择。)

0 个答案:

没有答案