1

当“CurrentFile”为空时,我有这段代码拒绝返回“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"则代码可以正常工作并且正确包含“某物”。

我究竟做错了什么?

C++ Builder 东京 10.3.2

4

2 回答 2

1

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

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

请注意,如果由于任何原因无法将值转换为 an ,则TIniFile::ReadInteger()返回该Default值,无论是因为它不存在、为空白、无法读取、不是数字十六进制格式等。Identint

于 2018-10-02T00:38:19.490 回答
0

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

Delphi 风格的字符串(AnsiStringRawByteStringUnicodeStringWideString)在 C++Builder 中实际上不是 NULL,即使这是调试器显示的内容。换句话说,每当您的调试器显示NULL此类字符串时,请将其视为“空字符串”。

还要注意的是

if (s == NULL)

不会返回您所期望的。改为使用s.IsEmpty()

这是完整的答案:

XE6 如何检查 UnicodeString 是否为空?

于 2018-10-01T09:18:56.063 回答