无法通过空格将文本文件行分隔为向量

时间:2018-11-03 15:54:53

标签: c++

输入文本文件:

s_1 s_2 1
s_3 s_4 2
s_5 s_6 3

我想要一个向量,它将每个字符串元素存储到向量中。请记住,我一直在研究其他帖子,但是我无法通过空白分开。

这是我的代码:

#include<iostream>
using std::cout; using std::endl;
#include<fstream>
using std::ifstream;
#include<vector>
using std::vector;
#include<string>
using std::string; using std::getline;
#include<sstream>
using std::stringstream; using std::ostringstream; using std::istringstream;

void read_file(const string &fname) {
    string file;
    string line;
    vector<string> temp_vec;

    file = fname;
    ifstream in_file;

    in_file.open(file);

    while(getline(in_file, line)) {
        istringstream ss(line);
        string token;
        getline(ss, token, ' ');
        temp_vec.push_back(token);
    }

    for (string ele:temp_vec) { //print the content of the vector
        cout << ele << endl;
    }
}

int main() {
    read_file("text_file.txt"); //insert your file path here
}

我在此代码中的错误是打印了以下内容:

s_1
s_3
s_5

但是,我希望向量存储每个元素并且是:

{s_1,s_2,1,s_3,s_4,2,s_5,s_6,3}

3 个答案:

答案 0 :(得分:2)

该行:

Download /dl/android/maven2/com/android/tools/build/gradle-core/3.1.2/gradle-core-3.1.2.pom

将行提取到空格。然后,对getline(ss, token, ' '); 的下一个调用从下一行开始,完全跳过前一行的所有进一步输入。

您要提取行的每个元素。这可以通过使用简单的getline循环来完成:

while

请注意,您不需要知道用空格分隔多少个项目。因此,如果每行有3个以上的项目,则该循环仍将正确运行而无需更改代码。

答案 1 :(得分:1)

#include<iostream>
using std::cout; using std::endl;
#include<fstream>
using std::ifstream;
#include<vector>
using std::vector;
#include<string>
using std::string;

void read_file(const string &fname) {
    ifstream in_file(fname);
    string token;
    vector<string> temp_vec;

    while( in_file.good() ) {
        in_file >> token;
        temp_vec.push_back(token);
    }

    for (string ele: temp_vec) { //print the content of the vector
        cout << ele << endl;
    }
}

int main() {
    read_file("text_file.txt"); //insert your file path here
}

答案 2 :(得分:0)

string token1, token2, token3;
while(getline(in_file, line)) {
    istringstream ss(line);
    ss >> token1 >> token2 >> token3;
    temp_vec.push_back(token1);
    temp_vec.push_back(token2);
    temp_vec.push_back(token3);
}

cout << "{";
for (auto &ele : temp_vec) { //print the content of the vector
    cout << ele;
    if (&ele != temp_vec.data() + temp_vec.size() - 1) {
        cout << ", ";
    }
}
cout << "}" << endl