使用分隔符从文件中分配变量

问题描述 投票:-1回答:2

我有一个文件map.txt:

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

我想在“|”之前分配第一部分到cityString,第二部分是edgesString,第三部分是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();

我明白了

||
||

而不是我想要的“蒙特利尔”。我认为错误是我从文件中读取变量的方式,但我不知道如何解决它。请帮忙。

c++ boost ifstream
2个回答
0
投票

尝试更像这样的东西:

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;

-1
投票

因此,根据我的理解,这里有很多内容:首先,文件的实际内容存储在line变量中。这个变量似乎从未使用过。因此,您的矢量未设置。

然后控制台上的输出是'cout << cityString <<“|”的结果<< edgesString <<“|” << costString <<“\ n”;`语句,因为你从不影响那些变量的任何值,它们是“空字符串”。并且因为您的文件中有2行,所以使用while语句最终得到:

||
||

另外我认为你可以分开而不使用boost。

使用此代码,您可以获得正确的输出:

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++;
© www.soinside.com 2019 - 2024. All rights reserved.