0

我已经阅读了一些详细说明如何标记字符串的线程,但我显然太厚了,无法将他们的建议和解决方案适应我的程序。我正在尝试做的是将大(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++ 使用的标准库。

4

1 回答 1

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;
}
于 2012-12-06T05:06:40.347 回答