我一直在努力使用一些非常简单的代码来将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的选择。)