从带有重复项的INI文件中读取

时间:2014-11-08 17:35:06

标签: c++ visual-c++

我有以下INI文件:

    [Connection]
    Protocol=HTPP

    [Connection]
    Protocol=HTTPS

有什么方法可以将两个协议保存在两个不同的变量中?我试着写:

    int a = GetPrivateProfileString(_T("Connection"), _T("Protocol"), _T(""), protocolChar, 32, path);
    int ab = GetPrivateProfileString(_T("Connection"), _T("Protocol"), _T(""), protocolChar2, 32, path);

结果是ProtocolChar,protocolChar2,虽然都接收“HTTP” 如何以不同的方式保持所有协议的变量?

1 个答案:

答案 0 :(得分:0)

不,GetPrivateProfileString不支持具有相同名称的多个部分,并且始终使用它遇到的第一个部分。可以使用几种直接的方法。第一种是简单地在每个部分名称的末尾添加一个数字。

[Connection0]
Protocol=HTPP

[Connection1]
Protocol=HTTPS

[Connection2]
Protocol=FTP

[Connection3]
Protocol=Telnet

使用这种方法,您可以遍历各个Connection部分,直到您尝试加载不存在的部分。

#include <windows.h>
#include <iostream>
#include <sstream>

int main()
{
    for (DWORD i = 0, size = 1; size != 0; ++i)
    {
        std::ostringstream name;

        name << "Connection" << i;
        std::string protocol(100, 0);
        size = GetPrivateProfileStringA(
            name.str().c_str(),
            "Protocol",
            NULL,
            &protocol[0],
            protocol.size(),
            "./test1.ini");

        if (size != 0)
        {
            protocol.resize(size);
            std::cout
                << name.str().c_str()
                << ":protocol=" << protocol << "\n";
        }
    }
}

另一种方法是有一个主要部分(即Connections),它定义了每个具有唯一名称的其他部分的列表。这样做的好处是这些部分更易于管理,一个部分被删除,无需重新排序其余部分。在这种情况下,您只需重写Connections

的内容即可
[Connections]
Connection0=HTTPConnection
Connection1=HTTPSConnection
Connection2=FTPConnection
Connection3=TelnetConnection

[HTTPConnection]
Protocol=HTPP

[HTTPSConnection]
Protocol=HTTPS

[FTPConnection]
Protocol=FTP

[TelnetConnection]
Protocol=Telnet

使用这种方法,您可以迭代Connections的条目,然后加载每个部分。

#include <windows.h>
#include <iostream>
#include <sstream>

int main()
{

    for (DWORD i = 0, size = 1; size != 0; ++i)
    {
        std::ostringstream name;

        name << "Connection" << i;
        std::string section(100, 0);
        size = GetPrivateProfileStringA(
            "Connections",
            name.str().c_str(),
            NULL,
            &section[0],
            section.size(),
            "./test1.ini");

        if (size != 0)
        {
            section.resize(size);
            std::string protocol(100, 0);
            size = GetPrivateProfileStringA(
                section.c_str(),
                "Protocol",
                NULL,
                &protocol[0],
                protocol.size(),
                "./test1.ini");
            if (size != 0)
            {
                protocol.resize(size);
                std::cout
                    << name.str().c_str()
                    << ":"
                    << section
                    << ":protocol=" << protocol << "\n";
            }
        }
    }
}