【问题标题】:TIniFile->ReadString returns null instead of ""TINiFile->ReadString 返回 null 而不是 ""
【发布时间】:2018-10-01 08:40:17
【问题描述】:

当“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

【问题讨论】:

  • 哦...我猜一个设置为NULL的unicodestring意味着它是空的????
  • 是的,在 Delphi 中,一个空字符串 (UnicodeString, AnsiString) 作为 NULL (nil) 返回。不确定它在 C++Builder 中是如何工作的。但是由于您正在调用 Delphi 函数,因此您可以期望返回 NULL (nil)。
  • @RudyVelthuis = 实际上,在 Delphi 中,调试器会为空字符串显示 "",而在 c++ 中,调试器会为空字符串显示 NULL。
  • 我认为它更像{ NULL },即一个只有 NULL 元素的结构。 AFAIK,在 C++Builder 中,这些字符串是结构或类,而在 Delphi 中,它们是内置类型。 C++Builder 结构或类模仿这些内置类型。
  • 是的,在 C++ 中,(Ansi|Wide|Unicode)String 是具有单个 Data 成员的类,当字符串为空时为 NULL。

标签: c++builder c++builder-10.2-tokyo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    还要注意的是

    if (s == NULL)
    

    不会返回您期望的结果。请改用s.IsEmpty()

    这是完整的答案:

    XE6 How do you check if a UnicodeString is null?

    【讨论】:

    • if (s == NULL)不起作用的原因是因为NULL被定义为0,所以if (s == 0)在比较之前将0转换为字符串,所以你真的改为if (s == "0")
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2018-11-28
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多