Назначение переменных из файла с разделителями - PullRequest
0 голосов
/ 05 марта 2019

У меня есть файл map.txt:

Montreal|Quebec,Toronto|30,40
New York|Boston,Philadelphia,Scranton|20,10,50

Я хочу назначить первую часть перед "|"для cityString, вторая часть дляdgeString и третья часть для costString.Затем я буду использовать boost, чтобы разбить строки на соответствующие векторы, и назначить эти векторы пользовательскому объекту CityNode.

Это мой код:

string cityString;
string edgesString;
string costString;
vector<string> edgesVector;
vector<string> costVector;
vector<CityNode> cities;
int i = 0;
bool used = true;
string line;
ifstream myfile(this->fileName);

if (myfile.is_open())
{
    while (getline(myfile, line))
    {
        cout << cityString << "|" << edgesString << "|" << costString << "\n";    // read line of file

        boost::split(edgesVector, edgesString, [](char c) {return c == ','; });    //split edgesString into vector delimiter: ','
        boost::split(costVector, costString, [](char c) {return c == ','; });    // split costString into vector delimiter: ','


        //ASSIGN VARIABLES
        cities[i].setValues(cityString, edgesVector, costVector);
        i++;
    }

    myfile.close();
}
else cout << "Incorrect file format";
return cities;

, когда я вызываю

 cout << cities[0].getName();

Я получаю

||
||

вместо "Монреаля", как я хочу.Я думаю, что ошибка заключается в том, как я читаю переменные из файла, но я не знаю, как это исправить.Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Попробуйте вместо этого что-нибудь еще:

string edgesString;
string costString;
string line;
vector<string> edgesVector;
vector<string> costVector;
vector<CityNode> cities;

ifstream myfile(this->fileName);
if (myfile.is_open())
{
    while (getline(myfile, line))
    {
        istringstream iss(line);
        getline(iss, cityString, "|");
        getline(iss, edgesString, "|");
        getline(iss, costString);

        cout << cityString << "|" << edgesString << "|" << costString << "\n"; // display line from file

        auto onComma = [](char c){ return c == ','; };
        boost::split(edgesVector, edgesString, onComma); //split edgesString into vector delimiter: ','
        boost::split(costVector, costString, onComma); // split costString into vector delimiter: ','

        //ASSIGN VARIABLES
        CityNode city;
        city.setValues(cityString, edgesVector, costVector);
        cities.push_back(city);
    }

    myfile.close();
}
else
    cout << "Cannot open file";

return cities;
0 голосов
/ 05 марта 2019

Итак, что я понимаю, здесь есть несколько вещей: Сначала фактическое содержимое вашего файла сохраняется в переменной line. Эта переменная, кажется, никогда не используется после. Следовательно, ваши векторы не установлены.

Тогда вывод на консоль является результатом 'cout << cityString << "|" <<dgeString << "|" << costString << "\ n"; `, так как вы никогда не влияете на эти переменные, они являются" пустыми строками ". И поскольку в вашем файле 2 строки, с оператором while вы получите: </p>

||
||

Также я думаю, что вы можете разделить без использования повышения.

с этим кодом у вас есть правильный вывод:

boost::split(lineVect, line,[](char c) { return c == '|'; });

cout << lineVect[0] << "|" << lineVect[1] << "|" << lineVect[2] << "\n";    

boost::split(edgesVector, lineVect[1], [](char c) { return c == ','; });    //split edgesString into vector delimiter: ','
boost::split(costVector, lineVect[2], [](char c) { return c == ','; });    // split costString into vector delimiter: ','

//ASSIGN VARIABLES
cities[i].setValues(lineVect[0], edgesVector, costVector);
i++;
...