【问题标题】:Assigning variables from file with delimiters使用分隔符从文件中分配变量
【发布时间】:2019-03-05 20:16:21
【问题描述】:

我有一个文件 map.txt:

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

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

我明白了

||
||

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

【问题讨论】:

  • 然后,我将使用 boost 将字符串拆分为相应的向量,并将这些向量分配给自定义的 CityNode 对象。 – 为什么?您如何处理这些值?
  • cout 并没有按照您的评论所说的那样做。
  • @NathanOliver 那里不需要提升。
  • @NathanOliver 因为该任务根本不需要提升。
  • @HassanG 基本上使用std::getline() 从文件中读取一行,然后使用std::getline()'|' 分隔符将字符串从std::istringstream 中拆分出来,并进一步使用其他分隔符。看起来根本不需要使用 boost 来做到这一点。

标签: c++ boost ifstream


【解决方案1】:

试试类似的方法:

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;

【讨论】:

    【解决方案2】:

    所以据我所知,这里有很多东西: 首先,文件的实际内容存储到line 变量中。 这个变量之后似乎再也没有使用过。因此,您的向量没有设置。

    那么控制台上的输出就是'cout

    ||
    ||
    

    另外我认为你可以在不使用 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++;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2022-10-04
      相关资源
      最近更新 更多