Wczytywanie liczb z pliku.

0

W jaki sposób wczytać liczby oraz nazwy opcji, chcę zmodyfikować ten kod:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::string option = "";
    std::string value = "";
    std::string line = "";
    std::ifstream cfg("game.cfg");
    int index = 0;
    if (cfg.is_open())
    {
        while (getline(cfg, line) )
        {
            if(line[0] != '#' && line != "")
            {
                value = line;
                option = line;

                index = option.find('=');
                value.erase(0, index+1);
                option.erase(index, line.length()-1);

                index = 0;
                line = "";

                std::cout<<option<<" = "<<value<<"\n";

                option = "";
                value = ""; //Chcę mieć liczby
            }
        }
        cfg.close();
    }
}

Przykładowy plik:

#GAME CLIENT CONFIGURATION FILE
#DO NOT CHANGE ANY CONTENTS OF THIS FILE

#########################################
#ONLY FOR PEOPLE WHO KNOW WHAT TO DO HERE
#########################################

#BEGIN

fullscreen=1 //nazwa_opcji=liczba
width=0
height=0
vsync=0
renderdistance=100

#END
0

Użyj debuggera lub wypisz pobrane dane przed obróbką, aby zobaczyć na jakich danych pracuje program, a zrozumiesz błąd w myśleniu.

0

Mógłbym też zrobić:

int index = value.length()-1;
int n = 1;
int num = 0;
while(index >= 0)
{
     num += (value[index] - '0')  *  n;
     n *= 10;
     index--;
}

Tylko czy da się to zrobić krótszym kodem, bardziej czytelnym?

0

najpierw uwstaw strumien za #begin (znajdz gdzie jest a nastepnie uzyj http://www.cplusplus.com/reference/istream/istream/seekg/)
pozniej uzyj std::map<string, int> i wczytuj linia po linii (najlepiej jakbys mial spacje w pliku bo wtedy nie musialbys parsowac stringa, bo operator >> wczyta po prostu nastepne slowo)
a parsowac stringa to chyba potrafisz ;)

0
const std::String BeginOptionsMark = "#BEGIN";
const std::String EndOptionsMark = "#End";

std::unordered_map<std::string, int> LoadConfiguration(std::istream& input)
{
     std::string line;
     while (std::getline(input, line)) {
          if (line == BeginOptionsMark) {
               break;
          }
     }
     std::unordered_map<std::string, int> result;
     while (std::getline(input, line)) {
          if (line == EndOptionsMark) {
               break;
          }
          std::istringstream data { line };
          std::string name;
          int value;
          data >> std::ws;
          if (std::getline(data, name, '=') >> value) {
                if (name[0] != StartCommentChar) {
                    result[name] = value;
                }
          } else {
                if (name[0] != StartCommentChar) {
                    std::cerr << "Unexpected entry: " << line << '\n';
                }
          }
     }
     return result;
}

0

A czy tak będzie dobrze?

    std::string option = "";
    int value = 0;
    std::ifstream cfg("game.cfg");
    if(cfg.is_open())
    {
        while(!cfg.eof())
        {
            cfg >> option >> value;

            std::cout<<option<<" = "<<value<<"\n";
        }
        cfg.close();
    }

Jak tutaj można w prosty sposób zaimplementować pomijanie pustych linii i komentarzy zaczynających się od '#' (jednoliniowych)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1