Как я могу прочитать содержимое строки файла, используя номер строки - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть следующий фрагмент кода, который работает нормально:

 ifstream NDSConfig( "NDS.config" ) ;
        string szConfigVal ;
        while( getline( NDSConfig, szConfigVal ) )
        {
            //code
        }

Но проблема в том, что мне нужно обновить состояние флажка, сравнивая значения строк.Затем код будет похож на следующий:

 ifstream NDSConfig( "NDS.config" ) ;
        string szConfigVal ;
        while( getline( NDSConfig, szConfigVal ) )
        {
            if(szConfigVal == "AutoStart = 1")
            {
                      //Set Check Box True
            }
            else if(szConfigVal == "AutoStart = 0")
            {
                      //Set Check Box False
            }

            if(szConfigVal == "AutLogHistory = 1")
            {
                      //Set Check Box True
            }
            else if(szConfigVal == "AutLogHistory = 0")
            {
                      //Set Check Box False
            }

            if(szConfigVal == "AutoScan = 1")
            {
                      //Set Check Box True
            }
            else if(szConfigVal == "AutoScan = 0")
            {
                      //Set Check Box False
            }

            if(szConfigVal == "AutoMount = 1")
            {
                      //Set Check Box True
            }
            else if(szConfigVal == "AutoMount = 0")
            {
                      //Set Check Box False
            }

            if(szConfigVal == "AutoOpen = 1")
            {
                      //Set Check Box True
            }
            else if(szConfigVal == "AutoOpen = 0")
            {
                      //Set Check Box False
            }

            if(szConfigVal == "LastConnectedSvr = 1")
            {
                      //Set Check Box True
            }
            else if(szConfigVal == "LastConnectedSvr = 0")
            {
                      //Set Check Box False
            }
        }

Если я собираюсь использовать цикл while, то мое состояние будет переопределено и будет обновлено только последнее значение или состояние цикла.Есть ли другой выход.Мне нужно установить значения флажка после чтения из файла конфигурации.Файл конфигурации выглядит следующим образом:

AutoStart = 0
AutLogHistory = 1
AutoScan = 1
AutoMount = 0
AutoOpen = 0
LastConnectedSvr = 1

Хотя я могу иметь только один, если и все остальное, как иначе, если поможет, но мне нужен лучший способ.

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

В качестве альтернативы, используйте boost::program_options, это идеально подходит для того, что вам нужно!

РЕДАКТИРОВАТЬ: чуть более подробно, program_options имеет метод для анализа файла конфигурации, такого как ваш, и при настройке program_options, вы можете передать переменную для хранения значения из файла конфигурации. Взгляните на их простой пример, он станет совершенно ясным ...

Другой вариант - хранить ключи вmap со значением по умолчанию 0, а затем, когда вы анализируете свой файл, установите ключ для значения, которое вы читаете из файла ...

РЕДАКТИРОВАТЬ:

с помощью параметров программы (это непроверенный код, пожалуйста, попробуйте обратиться к документации и исправить при необходимости!)

int AutoStart;
int AutLogHistory;
int AutoScan;
int AutoMount;
int AutoOpen;
int LastConnectedSvr;

po::options_description desc("Allowed options");
desc.add_options()
    ("help", "produce help message")
    ("AutoStart", po::value<int>(&AutoStart)->default_value(0),"AutoStart")
    ("AutLogHistory", po::value<int>(&AutLogHistory)->default_value(0),"AutLogHistory")
    ("AutoScan", po::value<int>(&AutoScan)->default_value(0),"AutoScan")
    ("AutoMount", po::value<int>(&AutoMount)->default_value(0),"AutoMount")
    ("AutoOpen", po::value<int>(&AutoOpen)->default_value(0),"AutoOpen")
    ("LastConnectedSvr", po::value<int>(&LastConnectedSvr)->default_value(0),"LastConnectedSvr")
;

std::ifstream config("NDS.config");

po::parse_command_line(config, desc, true);

Когда этот лот выполняется, различные целые числа будут иметь значения из файла (или по умолчанию 0).

Отличительной особенностью этого подхода является то, что в ваших конфигурационных файлах могут быть разные типы , и до тех пор, пока они отформатированы как файлы INI, это будет работать.

Другой подход с использованием std :: map, ну @ Moo-Juice уже добавил рабочий код ...

2 голосов
/ 15 ноября 2010

Проблема, с которой вы столкнулись, заключается в вашей логике чтения этих строк. Вы можете использовать boost :: program_options, как уже упоминалось ранее, или даже какой-нибудь xml-ридер, но для быстрого и грязного решения вашей проблемы:

#include <string>
#include <map>
#include <algorithm>

// typedef some stuff so our fingers don't die.
typedef std::map<std::string, bool> CheckMap;
typedef CheckMap::iterator CheckMap_it;
typedef std::pair<std::string, bool> CheckPair;

std::string szKey, szVal;
// declare our map that will store the state
CheckMap map;


// insert possible config values
map.insert(CheckPair("AutoStart", false));
map.insert(CheckPair("AutLogHistory", false));
map.insert(CheckPair("AutoScan", false));
map.insert(CheckPair("AutoMount", false));
map.insert(CheckPair("AutoOpen", false));
map.insert(CheckPair("LastConnectedSvr", false));

// now loop through the file
ifstream NDSConfig( "NDS.config" ) ;
    string szConfigVal ;
    while( getline( NDSConfig, szConfigVal ) )
    {
        // erase any spaces in the line
    szConfigVal.erase(std::remove_if(szConfigVal.begin(), szConfigVal.end(), isspace), szConfigVal.end());

        // locate equals, split in to <key> <value> using that.
        std::string::size_type equals(szConfigVal.find('='));
    if(equals != std::string::npos) // exists?
    {
        szKey = szConfigVal.substr(0, equals);
        szVal = szConfigVal.substr(equals + 1);

        // locate key and set value
        CheckMap_it it(map.find(szKey));
        if(it != map.end()) // sanity check
        {
        // could use a boost-type cast here, but I'm keeping it simple
        it->second = (szVal == "1") ? true : false;
        };
    };
    }

Теперь, в конце, карта содержит значения со значениями из файла в них.Вы можете перебирать их и делать с ними все, что вам нравится.

1 голос
/ 15 ноября 2010

Вы можете использовать усиление синтаксического анализатора аргументов программы , в частности анализатор конфигурационных файлов , чтобы получить все аргументы программы.

Это пример от boost (небольшие модификации мои):

#include <boost/program_options.hpp>
namespace po = boost::program_options;


#include <iostream>
#include <fstream>
#include <iterator>
using namespace std;

// A helper function to simplify the main part.
template<class T>
ostream& operator<<(ostream& os, const vector<T>& v)
{
    copy(v.begin(), v.end(), ostream_iterator<T>(cout, " "));
    return os;
}


int main(int ac, char* av[])
{
        std::cout<<av[0]<<std::endl;

std::vector<std::string> incsss;
std::vector<std::string> filsss;

    try {
        int opt;
        string config_file;

        // Declare a group of options that will be
        // allowed only on command line
        po::options_description generic("Generic options");
        generic.add_options()
            ("version,v", "print version string")
            ("help,h", "produce help message")
            ("config,c", po::value<string>(&config_file)->default_value("multiple_sources.cfg"),
                  "name of a file of a configuration.")
            ;

        // Declare a group of options that will be
        // allowed both on command line and in
        // config file
        po::options_description config("Configuration");
        config.add_options()
            ("optimization", po::value<int>(&opt)->default_value(10),
                  "optimization level")
            ("include-path,I",
              po::value< vector<string> >(&incsss)->composing(),
                 "include path")
            ;

        // Hidden options, will be allowed both on command line and
        // in config file, but will not be shown to the user.
        po::options_description hidden("Hidden options");
        hidden.add_options()
        ("input-file", po::value< vector<string> >(&filsss), "input file")
            ;


        po::options_description cmdline_options;
        cmdline_options.add(generic).add(config).add(hidden);

        po::options_description config_file_options;
        config_file_options.add(config).add(hidden);

        po::options_description visible("Allowed options");
        visible.add(generic).add(config);

        po::positional_options_description p;
        p.add("input-file", 3);

        po::variables_map vm;
        store(po::command_line_parser(ac, av).
              options(cmdline_options).positional(p).run(), vm);
        notify(vm);

        ifstream ifs(config_file.c_str());
        if (!ifs)
        {
               cout << "can not open config file: " << config_file << "\n";
            return 0;
        }
        else
        {
            store(parse_config_file(ifs, config_file_options), vm);
            notify(vm);
        }

        if (vm.count("help")) {
            cout << visible << "\n";
            cout<<"here"<<std::endl;
            return 0;
        }

        if (vm.count("version")) {
            cout << "Multiple sources example, version 1.0\n";
            return 0;
        }

        if (vm.count("include-path"))
        {
            cout << "Include paths are: "
                 << vm["include-path"].as< vector<string> >() << "\n";
        }

        if (vm.count("input-file"))
        {
            cout << "Input files are: "
                 << vm["input-file"].as< vector<string> >() << "\n";
        }

        cout << "Optimization level is " << opt << "\n";


        cout << "incsss constains : " <<incsss << std::endl;
        cout << "filsss constains : " <<filsss << std::endl;
    }
    catch(exception& e)
    {
        cout << e.what() << "\n";
        return 1;
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...