如何通过分隔符拆分字符串并将每个字符串放入不同的向量?

时间:2017-03-23 22:26:27

标签: c++ parsing split

我正在尝试输入一个由3个子串组成的输入并解析它:

城市名称,经度和纬度。

EX:"Monticello 36.8297222 -84.8491667"

这样我就可以push_back()将城市,纬度和经度加入到他们自己的vector个对象中。但我无法弄清楚如何做到这一点。

vector<string> city;
vector<float> latitude;
vector<float> longitude;

int main(int argc, char* argv[]){
    fstream inData;
    inData.open(argv[1]);   // open the specified file for reading. 
    string line;
    if (!inData.fail())         // if the file exits and is opened successfully
    {
        while(getline(inData, line))            // read every line from the file until the end
        {
            //here is where I want to parse and pushback into it's vector
        }
    }
    inData.close();

4 个答案:

答案 0 :(得分:0)

std::getline可以使用一个附加参数,一个分隔符,默认情况下设置为'\ n'。你实际上是用它来逐行阅读。

在阅读一行后,您可以做的是将该行分配给 fig, ax = plt.subplots(figsize=(12,8)) df.groupby('seq').plot(kind='line', x = "x1", y = "y1", ax = ax) plt.title("abc") plt.show() 的实例,并让std::istringstream按空格分割(默认行为)。

operator>>

答案 1 :(得分:0)

您可以使用字符串流(更好:istringstream)来解析该行并将结果写入变量;然后使用变量将它们推回到向量中:

while(getline(inData, line)) 
{
  std::istringstream ss (line);

  std::string city_s;
  float longitude_f;
  float latitude_f;

  if (ss >> city_s >> latitude_f >> longitude_f) {
    city.push_back(city_s);
    latitude.push_back(latitude_f);
    longitude.push_back(longitude_f);
  }
}

答案 2 :(得分:0)

原始代码的重构和更完整版本。使用c ++ 11。

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

struct place {
    std::string city;
    double latitude;
    double longitude;
};

std::vector<place> read_places(std::istream& is)
{
    place buffer;
    std::vector<place> places;
    while (is >> buffer.city >> buffer.latitude >> buffer.longitude) {
        places.push_back(std::move(buffer));
    }
    return places;
}

int main(int argc, char* argv[]) {

    // preconditions
    if (argc < 2) {
        std::cerr << "usage: myprog <inputfile>\n";
        std::exit(4);
    }

    std::fstream inData(argv[1]);
    if (!inData) { std::cerr << "failed to open " << argv[1]; std::exit(100); }

    auto places = read_places(inData);
    inData.close();

    // now use places
    // ...
}

答案 3 :(得分:0)

此外,您可以使用字符串标记器 - strtok()并使用“”作为分隔符。以下是可能对您有所帮助的链接 - http://www.cplusplus.com/reference/cstring/strtok/