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 样式的字符串(AnsiString
、RawByteString
、UnicodeString
和 WideString
)在 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
值任何原因,是否因为不存在、空白、无法读取、不是十六进制数字格式等
我有一段代码在 "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 样式的字符串(AnsiString
、RawByteString
、UnicodeString
和 WideString
)在 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
值任何原因,是否因为不存在、空白、无法读取、不是十六进制数字格式等