Borland BCB5 TInifile使用Readstring()忽略引号?

时间:2016-06-02 15:03:37

标签: c++ delphi c++builder ini vcl

我对Borland C ++ Builder 5并不熟悉,而且我遇到了一个问题。

我有一个INI文件:

[Section1]
Ident1="myUser1"
Ident2=myPassword

我使用以下代码阅读了用户名和密码值:

{
auto_ptr<TIniFile> ifile(new TIniFile(myinifile));
AnsiString InternalUser= ifile->ReadString("Section1", "Ident1", "Defaultuser");
AnsiString InternalPassword= ifile->ReadString("Section1", "Ident2","Defaultpassword");
}

这是函数声明:

virtual AnsiString __fastcall ReadString(const AnsiString Section, const AnsiString Ident, const AnsiString Default);

预期产出:

Ident1="myUser1" (with ")
Ident2=myPassword

实际输出:

Ident1=myUser1 (without ")
Ident2=myPassword

在尝试调试时,我收到了许多我不知道的Delphi系统调用,无法找到文档,例如LStrToPCharLStrClr等。

我期待某种Trim(),但错了。

有人可以告诉我这个问题吗?

2 个答案:

答案 0 :(得分:4)

这个类是很久以前弃用的Windows INI文件API的包装器。读取值的函数是GetPrivateProfileString,其文档说明:

  

如果与lpKeyName关联的字符串用单引号或双引号括起来,则当GetPrivateProfileString函数检索字符串时,将丢弃这些标记。

因此你观察到的行为。

答案 1 :(得分:2)

似乎不是由Borland引起的问题,而是基础Windows API例程的行为。使用MSVC进行快速检查会得到相同的结果。

#include "stdafx.h"
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{    
    TCHAR buf[400];
    GetPrivateProfileString( _T("Test"), _T("Test"), _T("Default"), &buf[0], 400, _T("test.ini"));
    _tprintf(_T("%s\n"),&buf);

    return 0;
}

INI档案:

[Test]
Test="string with quotes"

结果:

string with quotes

这是documented behavior

  

如果与lpKeyName关联的字符串用单引号或双引号括起来,则当GetPrivateProfileString函数检索字符串时,将丢弃这些标记。