无法将文本文件行按空格分隔到向量中

Posted

技术标签:

【中文标题】无法将文本文件行按空格分隔到向量中【英文标题】:Cannot seperate text file lines by whitespace into vector 【发布时间】:2018-11-03 15:54:53 【问题描述】:

给定文本文件输入:

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

【问题讨论】:

getline(ss, token, ' '); 提取一个字符串,你需要一个循环或者ss &gt;&gt; str1 &gt;&gt; str2 &gt;&gt; str3; 建议——不要将using 子句与#include 交叉使用。只需先列出 #include 标头,然后列出 using 子句。 @PaulMcKenzie 感谢您对代码组织的建议!我是一个新的 C++ 程序员,所以我会记住这一点。 这并没有解决问题,而是养成将对象初始化为有意义的状态的习惯,而不是使用它们的默认构造函数并立即更改状态。即把ifstream in_file; in_file.open(file);改成ifstream in_file(file); @PeteBecker 再次感谢您为提高我的代码的可读性和能力提出建议。 【参考方案1】:

行:

getline(ss, token, ' ');

将行提取到空格。然后对getline 的下一次调用从下一行开始,完全跳过上一行的任何进一步输入。

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

    while (ss >> token)
        temp_vec.push_back(token);

请注意,您不需要知道有多少项目由空格分隔。因此,如果每行有 3 个以上的项目,循环仍然可以正常工作而无需更改代码。

【讨论】:

欣赏为什么我的 getline() 只打印文本文件行中的第一个元素的输入。这也有效!【参考方案2】:
#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

【讨论】:

非常感谢!这使得如何分离元素变得更加清晰。文本文件中的最后一个元素是否也会为您打印两次? 不。我的输出是:$ a.exe s_1 s_2 1 s_3 s_4 2 s_5 s_6 3 由于输入文件中的行尾符号('\n')过多,最后一个元素可能会打印两次。它使最后一个标记为空,因此变量ele 不会在循环中更改其值,因此它会再次打印最后一个非空值 太好了,你说得对,我的文件中有多余的新行。 while( in_file.good() ) in_file &gt;&gt; token; ... 应替换为 while( in_file &gt;&gt; token ) ... 【参考方案3】:
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

【讨论】:

以上是关于无法将文本文件行按空格分隔到向量中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 将空格分隔的文本文件插入 mysql? [关闭]

使用drush将以空格分隔的已启用模块列表转储到文本文件中。

如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符

使用 C++ 将空格分隔值文本转换为 .csv 然后保存 [关闭]

将一张excel表中的数据全部粘贴到txt文本文件中,如何做

使用带有自定义分隔符的 postgres 按字符大小复制文本文件