无法将文本文件行按空格分隔到向量中
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 >> str1 >> str2 >> 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 >> token; ...
应替换为 while( in_file >> 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 然后保存 [关闭]