将文本文件中的行解析为向量

时间:2019-01-25 10:30:17

标签: c++

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

using namespace std;

vector <string> tokenizeString(string filename, string delimiter);

int main() {

    vector<string> tokens = tokenizeString("cityLocation.txt", "-");
    for (int i = 0; i < tokens.size(); i++) {
        cout << tokens[i];
    }

    return 0;
}

vector <string> tokenizeString (string filename, string delimiter) {

    size_t pos = 0;
    vector<string>tokens;
    string token;
    ifstream cityText(filename);
    string line;
    while (getline(cityText, line)) {

        while ((pos = line.find(delimiter)) != string::npos) {
            token = line.substr(0,pos);
            tokens.push_back (token);       
            line.erase(0, pos + delimiter.length());
        }
    }


    return (tokens);    
}

这是我的代码,我的文本文件数据是

[1,1]-3-Big_City
[1,2]-3-Big_City
[1,3]-3-Big_City
[2,1]-3-Big_City
[2,2]-3-Big_City
[2,3]-3-Big_City
[2,7]-2-Mid_City
[2,8]-2-Mid_City
[3,1]-3-Big_City

我的代码正在跳过所有的大城市和中城市。 它仅打印出第一列和第二列数据。

我的分隔符应该是'-'。

我还没有尝试过将数据保存到向量中,但是想要一些关于如何做到这一点的建议

1 个答案:

答案 0 :(得分:2)

这是因为您需要在最后一个定界符之后的之后再次运行。您可以使用后测试循环来完成此操作,该循环将在pos == string :: npos时再执行一次,因此添加line.substr(pos,string::npos);作为令牌,该令牌被定义为从位置pos到结尾的子字符串。字符串。

vector <string> tokenizeString (string filename, string delimiter) {
    vector<string>tokens;
    string token;
    ifstream cityText(filename);
    string line;
    while (cityText >> line) {
        size_t pos = 0, lastpos=0;
        do {
            pos = line.find(delimiter, lastpos);
            token = line.substr(lastpos,pos-lastpos);
            tokens.push_back (token);
            lastpos=pos+1;
        } while (pos != string::npos);
    }
    return (tokens);
}