TIniFile-> ReadString возвращает ноль вместо "" - PullRequest
0 голосов
/ 01 октября 2018

У меня есть этот кусок кода, который отказывается возвращать «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 Tokyo 10.3.2

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

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");

Обратите внимание, что TIniFile::ReadInteger() возвращает Defaultзначение, если значение Ident не может быть преобразовано в int для любой причины, будь то потому, что она не существует, она пустая, ее нельзя прочитать, она не числоваяшестнадцатеричный формат и т. д.

0 голосов
/ 01 октября 2018

Мой вопрос глуп, но я не буду его удалять.Пусть другие тоже учатся на этом.Мой мозг Delphi пытался обойти странные концепции C ++ :)

Строки в стиле Delphi (AnsiString, RawByteString, UnicodeString и WideString) на самом деле не равны NULL в C ++Строитель, ДАЖЕ, хотя это то, что показывает отладчик.Другими словами, всякий раз, когда ваш отладчик показывает NULL для такой строки, воспринимайте ее как «пустую строку».

Следует также отметить, что

if (s == NULL)

не возвращаетчто вы ожидаетеВместо этого используйте s.IsEmpty().

Вот полный ответ:

XE6 Как проверить, является ли UnicodeString нулевым?

...