0

文字列をトークン化する方法を詳しく説明しているいくつかのスレッドを読みましたが、明らかに厚すぎて、彼らの提案や解決策を私のプログラムに適応させることができません。私がやろうとしているのは、大きな (5k+) 行ファイルの各行を 2 つの文字列にトークン化することです。行のサンプルを次に示します。

               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 に答える