2

我有一个 stl 地图容器,里面装满了成对的 vcl UnicodeString 对象。我正在尝试使用下面引用的代码将其转储到文件中,但我得到的不是我的字符串,而是一个充满十六进制地址的文件。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <map>

//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
      std::map<UnicodeString, UnicodeString> fm;
      fm[U"a"]=U"test";
      fm[U"b"]=U"test2";
      fm[U"c"]=U"test3";
      fm[U"z"]=U"last one";
      ofstream out("c:\\temp\\fm.txt");
      std::map<UnicodeString, UnicodeString>::const_iterator itr;
      for (itr = fm.begin(); itr != fm.end(); ++itr) {
          out << itr->first.c_str()<< ",\t\t"<< itr->second.c_str()<<std::endl;
      }

      out.close();

   return 0;
}

产生这个:

1f3b624,                1f5137c
1f3b654,                1f513bc
1f3b66c,                1f513fc
1f3b684,                1f258dc

我尝试了各种转换 c 字符串的方法,但似乎没有任何效果。

4

3 回答 3

3

像往常一样,答案很简单,@Dauphic 的评论让我明白了这一点。我使用的是“窄流”。解决方案是使用宽流,我惊讶地发现它存在!

解决方案是将流声明更改为:

std::wofstream out("c:\\temp\\fm.txt");

和 presto changeo 它的工作原理。

解决方案也在这里找到

于 2013-05-09T20:11:14.260 回答
1

问题是您试图将 a 输出const char32_t*到窄流;这种类型的流只需要窄字符串 ( char*)。窄流不支持此类字符串的输出。

最接近的匹配operator<<(const char32_t*)operator<<(void*),它输出给定的地址。

您需要创建一个重载operator<<(basic_ostream&, const char32_t*),将数组转换为可以输出到窄流的东西。

请注意,如果您想输出到人类可读的文本文件,您将不得不跳过这些环节;4 字节字符编码对于 Windows 来说是非标准的,并且本机 API 不提供任何处理它们的功能。

于 2013-05-09T18:23:27.170 回答
0

利用

F << AnsiString(S).c_str() << endl;

流 F 的位置;

S 是 UnicodeString

于 2013-12-29T23:33:06.443 回答