std :: map的流输出<unicodestring,unicodestring =“”>产生的地址不是字符串</unicodestring,>

时间:2013-05-09 18:09:57

标签: c++ stl c++builder vcl

我有一个stl map容器,里面装满了一对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字符串,但似乎没有任何效果。

3 个答案:

答案 0 :(得分:3)

像往常一样,答案非常简单,我是由@ Dauphic的评论引导的。我正在使用'窄流'。解决方案是使用广泛的流,我惊讶地发现存在!

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

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

和presto changeo它的工作原理。

还找到了解决方案here

答案 1 :(得分:1)

问题在于您尝试将const char32_t*输出到狭窄的流中;这种类型的流只需要窄字符串(char*)。这种类型的字符串的输出不受窄流的支持。

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

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

请注意,如果要输出到人类可读的文本文件,则必须跳过箍;对于Windows,4字节字符编码是非标准的,本机API不提供任何处理它们的功能。

答案 2 :(得分:0)

使用

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

of of F;

和S是UnicodeString