首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TIniFile->ReadString返回空而不是"“

TIniFile->ReadString返回空而不是"“
EN

Stack Overflow用户
提问于 2018-10-01 08:40:17
回答 2查看 568关注 0票数 1

当"DefaultVal“为空时,我有一段拒绝返回"CurrentFile”的代码:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
[x]
CurrentFile=

如果我将INI文件编辑为CurrentFile= "something",那么代码工作正常,并且s正确地包含了“东西”。

我做错了什么?

C++ Builder东京10.3.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-02 00:38:19

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

代码语言:javascript
复制
String s = pIni->ReadString (_D("x"), _D("CurrentFile"), _D("")); 
if (s.IsEmpty()) // or: if (s == _D(""))
    s = _D("DefaultVal");

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

票数 1
EN

Stack Overflow用户

发布于 2018-10-01 09:18:56

我的问题很愚蠢,但我不会删除它。让其他人也从中吸取教训。这是我的德尔菲大脑试图围绕奇怪的C++概念:)

Delphi风格的字符串(AnsiStringRawByteStringUnicodeStringWideString)在C++Builder中实际上并不为NULL,尽管调试器显示了这一点。换句话说,每当调试器为这样的字符串显示NULL时,就把它看作是“空字符串”。

还需要注意的是

代码语言:javascript
复制
if (s == NULL)

不会回报你所期望的。使用s.IsEmpty()代替。

以下是完整的答案:

XE6 How do you check if a UnicodeString is null?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52587371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档