我已经阅读了一些详细介绍如何标记字符串的线程,但是我显然太厚了,无法将他们的建议和解决方案调整到我的程序中。我正在尝试做的是将每行从一个大的(5k +)行文件标记为两个字符串。以下是这些行的示例:
0 -0.11639404
9.0702948e-05 0.00012207031
0.0001814059 0.051849365
0.00027210884 0.062103271
0.00036281179 0.034423828
0.00045351474 0.035125732
我在我的行和其他线程的其他示例输入之间找到的差异是我在要标记的部分之间有可变数量的空白。无论如何,这是我对标记化的尝试:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
ifstream input;
ofstream output;
string temp2;
string temp3;
input.open(argv[1]);
output.open(argv[2]);
if (input.is_open())
{
while (!input.eof())
{
getline(input, temp2, ' ');
while (!isspace(temp2[0])) getline(input, temp2, ' ');
getline (input, temp3, '\n');
}
input.close();
cout << temp2 << endl;
cout << temp3 << endl;
return 0;
}
我把它剪了一些,因为这里有麻烦的东西。我遇到的问题是temp2似乎永远不会有价值。理想情况下,它应该填充第一列数字,但事实并非如此。相反,它是空白的,temp3填充整行。不幸的是,在我的课程中我们还没有学习过向量,所以我不太确定如何在我见过的其他解决方案中实现它们,而且我不想只是复制粘贴代码来分配给让事情工作而不实际理解它。那么,我错过了哪些非常明显/已经回答/简单的解决方案?我想坚持g ++使用的标准库,如果可能的话。
答案 0 :(得分:2)
在这种情况下,您可以简单地忽略空格。提取字符串,提取器将自动跳过前导空格,并读取一串非空白字符:
int main(int argc, char **argv) {
std::ifstream in(argv[1]);
std::ofstream out(argv[2]);
std::string temp1, temp2;
while (in >> temp1 >> temp2)
;
std::cout << temp1 << "\n" << temp2;
return 0;
}