当"DefaultVal“为空时,我有一段拒绝返回"CurrentFile”的代码:
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正确地包含了“东西”。
我做错了什么?
C++ Builder东京10.3.2
发布于 2018-10-02 00:38:19
TIniFile::ReadString()只在指定的Ident值根本不存在时才返回Ident值。如果Ident值存在但为空,或者读取它时出错,则返回一个空字符串。如果希望在Default值为空的情况下使用Ident值,则必须手动检查该值,例如:
String s = pIni->ReadString (_D("x"), _D("CurrentFile"), _D(""));
if (s.IsEmpty()) // or: if (s == _D(""))
s = _D("DefaultVal");请注意,如果由于任何原因无法将TIniFile::ReadInteger()值转换为int,则Ident返回Ident值,无论这是因为它不存在,还是空白,不能读取,也不是数字十六进制格式,等等。
发布于 2018-10-01 09:18:56
我的问题很愚蠢,但我不会删除它。让其他人也从中吸取教训。这是我的德尔菲大脑试图围绕奇怪的C++概念:)
Delphi风格的字符串(AnsiString、RawByteString、UnicodeString和WideString)在C++Builder中实际上并不为NULL,尽管调试器显示了这一点。换句话说,每当调试器为这样的字符串显示NULL时,就把它看作是“空字符串”。
还需要注意的是
if (s == NULL)不会回报你所期望的。使用s.IsEmpty()代替。
以下是完整的答案:
https://stackoverflow.com/questions/52587371
复制相似问题