TIniFile->ReadString returns null 而不是“”

TIniFile->ReadString returns null instead of ""

我有一段代码在 "CurrentFile" 为空时拒绝 return "DefaultVal":

void __fastcall TForm1::Button2Click(TObject *Sender)
{
      TIniFile *pIni = new TIniFile("c:\Test\MyIni.ini");
      try
         {
         int i = pIni->ReadInteger (L"x", L"Level",  0);  //This is ok

         UnicodeString s = pIni->ReadString ("x", "CurrentFile",  "DefaultVal");   //Debugger shows s = NULL
         }
      __finally
         {
         pIni->Free();
         }
}
//---------------------------------------------------------------------------

这是 INI 文件:

[x]
CurrentFile=

如果我将 INI 文件编辑为 CurrentFile= "something",则代码可以正常工作并且 s 正确包含 "something"。

我做错了什么?

C++ Builder 东京 10.3.2

我的问题很愚蠢,但我不会删除它。让其他人也从中学习。这是我的 Delphi 大脑在尝试绕过奇怪的 C++ 概念 :)

Delphi 样式的字符串(AnsiStringRawByteStringUnicodeStringWideString)在 C++Builder 中实际上不是 NULL,EVEN尽管这是调试器显示的内容。换句话说,每当您的调试器为这样的字符串显示 NULL 时,请将其视为 "empty string"。

还要注意的是

if (s == NULL)

不return您所期望的。请改用 s.IsEmpty()

完整答案如下:

XE6 How do you check if a UnicodeString is null?

TIniFile::ReadString() returns Default 值仅当指定的 Ident 值根本不存在时。如果 Ident 值存在但为空,或者读取它时出错,则返回一个空字符串。如果您希望在 Ident 值为空时使用 Default 值,则必须手动检查该值,例如:

String s = pIni->ReadString (_D("x"), _D("CurrentFile"), _D("")); 
if (s.IsEmpty()) // or: if (s == _D(""))
    s = _D("DefaultVal");

请注意,如果 Ident 值无法转换为 int,则 returns 为 Default 值任何原因,是否因为不存在、空白、无法读取、不是十六进制数字格式等