`

C++__Read Section FiIe

阅读更多
#ifndef __SEC_FILE_H__
#define __SEC_FILE_H__

#include <string>
#include <vector>
#include <map>

using std::string;
using std::map;
using std::vector;

class SecFile
{
private:
    string path;
    static const char secComment = '#';
    vector<string> vFile;

public:
    int load(string path);
    string getPath();

    int getSec(string tag, vector<string>& vSec);
    int getMaps(string tag, map<string, string>& mKVs);
    int getKets(string tag, vector<string>& vKets);

    string getValue(string tag, string ket);
    string secToLine(string tag);

};

#endif //__SEC_FILE_H__


#include "secfile.h"
#include "stringutil.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int SecFile::load(string path)
{
    this->path = path;
    ifstream infile(path.c_str()); 
    if ( ! infile)
    {
        cout << "not this file" + path << endl;
        return -1; 
    }
    
    int rowCount = 0;
    string line;
    while (getline(infile, line))
    {
        line = StringUtil::Trim(line);
        if (this->secComment == line[0] || line.length() == 0) 
            continue;
        this->vFile.push_back(line);
        ++rowCount;
    }
    infile.close();
    return rowCount;
}

string SecFile::getPath()
{
    return this->path;
}

int SecFile::getSec(string tag, vector<string>& vSec)
{
    const string sBeg("<"+tag+">");
    const string sEnd("</"+tag+">");

    vector<string>::const_iterator ix = this->vFile.begin();
    for ( ; this->vFile.end() != ix; ++ix ) 
    {
        if ( 0 == sBeg.compare((*ix).substr(0,sBeg.size())) )
        {
            ++ix;
            break;
        }
    }

    if (this->vFile.end() == ix) return -1;
    for (int rowCount = 0 ;ix != vFile.end(); ++ix )
    {
        if (sEnd == *ix) return rowCount;   
        vSec.push_back(*ix);
        ++rowCount;
    }

    return -1;
}

int SecFile::getKets(string tag, vector<string>& vKets)
{
    string ket;
    int ketCount = 0;
    vector<string> vSec;
    this->getSec(tag,vSec);

    vector<string>::const_iterator ix = vSec.begin();
    for ( ; ix != vSec.end(); ++ix )
    {
        ket = (*ix).substr(0, (*ix).find('='));
        ket = StringUtil::Trim(ket);
        vKets.push_back(ket);
        ++ketCount;
    }
    return ketCount;
}

string SecFile::getValue(string tag, string ket)
{
    vector<string> vSec;
    this->getSec(tag,vSec);

    vector<string>::const_iterator ix = vSec.begin();
    for ( ; ix != vSec.end(); ++ix )
    {
        if ((*ix).substr(0, ket.length()) == ket)
        {
            string value = (*ix).substr((*ix).find('=') + 1 );
            value = StringUtil::Trim(value);
            return value;
        }
    }
    return "";
}

int SecFile::getMaps(string tag, map<string, string>& mKVs)
{
    vector<string> vSec;
    this->getSec(tag,vSec);

    string ket;
    string value;
    int iCount = 0;
    vector<string>::const_iterator ix = vSec.begin();

    for ( ; ix != vSec.end(); ++ix )
    {
        ket = (*ix).substr(0, (*ix).find('='));
        ket = StringUtil::Trim(ket);

        value = (*ix).substr((*ix).find('=') + 1 );
        value = StringUtil::Trim(value);

        mKVs.insert(make_pair(ket,value));
        iCount++;
    }

    return iCount;
}

string SecFile::secToLine(string tag)
{
    vector<string> vSec;
    if (this->getSec(tag, vSec) == -1) return "";

    vector<string>::const_iterator ix = vSec.begin();
    string sLine = *(ix++);

    for ( ;ix != vSec.end(); ++ix )
    {
        sLine = sLine + " " + *ix;
    }
    return sLine;      
}


分享到:
评论

相关推荐

    ReadConfigFile

    std::cerr &lt;&lt; "Failed to read from the ini file." ; } return 0; } ``` ### 5. 错误处理与优化 在实际应用中,需要处理读取失败的情况,可能是因为文件不存在、无权限或其他系统错误。此外,为了提高代码的可...

    ini-File-Access-class.zip_C++ FILE类_c 文件操作类_ini

    `ini-File-Access-class.zip` 提供了一个封装好的C++类,专门用于处理INI文件的操作,这使得开发者能更方便地读写这些配置数据。下面我们将详细探讨C++中的FILE类、文件操作类以及INI文件的处理方法。 C++标准库中...

    Homework 7_Knowledge items of C++_(part 2).zip

    I. Design of the homework In this homework, we will practice some important knowledge of C++ in the chapters on classes, ...The testing .cpp files, whose file names include the prefix "test", are comple

    37346.zip_Windows编程_Visual_C++_

    HANDLE hFile = CreateFile(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return sections; char szBuffer...

    INI_file_TEST.rar_配置文件

    "INI_file_TEST.rar_配置文件"是一个示例,展示了如何使用INI文件来存储并读取应用的配置参数,特别是与界面尺寸相关的设置,如主窗体的长宽高。 INI文件是一种常见的配置文件格式,源自早期的Windows操作系统。它...

    C++读取、写入ini配置文件节点键值信息实例源代

    std::string value = ini.read("Section1", "Key1"); std::cout 的值: " ; value = ini.read("Section2", "Key3"); std::cout 的值: " ; return 0; } ``` 这个例子展示了如何创建一个IniFile类,该类提供了...

    很好用的INI File类和实例

    在C++中,我们可以自定义一个INI File类来处理此类文件。以下是一个简单的类设计: ```cpp class IniFile { public: IniFile(const std::string& filePath); void write(const std::string& section, const ...

    精选_编程实现对ini配置文件的读写_源码打包

    config.read('config.ini') section1_value1 = config.get('Section1', 'Key1') section1_value2 = config.get('Section1', 'Key2') section2_value3 = config.get('Section2', 'Key3') ``` 写入配置文件: ```...

    VC6 配置文件ini操作

    在Visual C++ 6(简称VC6)环境下,开发人员可以利用MFC(Microsoft Foundation Classes)库中的CIniFile类来方便地读写ini配置文件。CIniFile类提供了许多成员函数,使得对ini文件的读写和修改变得非常便捷。 首先...

    C++共享内存示例

    FILE_MAP_ALL_ACCESS, // 所有权限,包括读写 0, // 高32位的偏移量 0, // 低32位的偏移量 memSize); // 映射的内存大小 if (pMem == NULL) { CloseHandle(hMapFile); std::cerr &lt;&lt; "Failed to map view of ...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    As every C++ programmer knows, the language has many powerful features, but this power brings with it complexity, which in turn can make code more bug-prone and harder to read and maintain....

    删除INI文件中指定的文件

    delete_file_from_ini('example.ini', 'Section1', 'Key1') ``` 四、注意事项 在执行删除操作时,务必小心,因为这会永久性地改变文件内容。确保在进行此类操作前有备份,以防意外。同时,如果文件正在被其他进程...

    C++ ini文件读写

    fprintf(file, "[%s]\n%s=%s\n", section, key, value); fclose(file); } } void readIni(const char* filename, const char* section, const char* key, char* value, int maxLen) { FILE* file = fopen...

    c++ builder 读写ini配置文件实例

    除了读写字符串,`TIniFile`还提供了读写整数(`ReadInteger`/`WriteInteger`)、布尔值(`ReadBool`/`WriteBool`)等方法。 在完成所有操作后,记得释放`TIniFile`对象: ```cpp delete Ini; ``` 在提供的文件...

    Linux Windows C++读写ini文件

    void writeIniFile(const std::string& filePath, const std::map, IniSection&gt;& sections) { // 写入ini文件的逻辑... } ``` **6. 使用第三方库libconfig** libconfig是一个强大的配置文件解析库,它支持ini文件...

    操作系统读者写者问题源程序

    CRITICAL_SECTION cs_Read; struct ThreadInfo //线程信息 { int Threadhao; //线程序号 char ThreadClass; //线程类别 double ThreadStartTime; //线程开始时间 double ThreadRunTime; //线程读写持续时间 }; ...

    ini文件解析

    在C++编程中,处理ini文件可以帮助我们实现程序的个性化配置和持久化存储。下面将详细介绍如何在C++中实现ini文件的解析,以及提供的demo示例。 1. ini文件结构: ini文件通常包含多个节(Section),每个节下面有...

    c++ stl 读ini文件

    void IniFile::read(const std::string& filename) { std::ifstream file(filename); std::string line, section, key, value; if (file.is_open()) { while (std::getline(file, line)) { // 处理空行和注释...

    ini文件读写

    不同的编程语言通常都有对应的库或模块来支持ini文件操作,如Python的`ConfigParser`,C++的`pugixml`,Java的`java.util.Properties`等。 七、注意事项 1. 在读写ini文件时,需确保文件权限允许读写操作。 2. 写入...

    Linux编程读取ini文件

    void read_ini_file(char* filename) { FILE* file = fopen(filename, "r"); if (file == NULL) { printf("Failed to open the ini file.\n"); return; } char line[256]; while (fgets(line, sizeof(line)...

Global site tag (gtag.js) - Google Analytics