0

getline を使用して改行の終わりまで読み取りますが、c++ getline はスペースまで取得します。

私はtxtファイルデータを持っています

アドレス(タブ文字)1420 ハッピーレーン

私がする時

getline(reader, ss, '\t') ss 文字列でアドレスを取得します。getline(reader, ss, '\n') を実行すると、1420 になります。

「1420 Happy Lane」がいっぱい欲しいのですが、どうやって手に入れるのですか?

ありがとう。

#include <fstream>
#include <string>
#include <iostream>
#include <vector>
#include <sstream>

using namespace std;
int main( int argc, char *argv[] )
{
        if( argc < 2 )
        {
                cout << "Missing filename as first argument" << "\n";
                exit(2);
        }

        vector<string> myvector;
        string ss;
        int i=0, j=0;

        ifstream reader(argv[1]);

        if (! reader )
        {
                cout << "Error opening input file : " << " " << argv[1] << '\n';
                return -1;
        }

        while( !reader.eof())
        {
                 if ((i+1) % 2 == 0 )
                        getline(reader, ss, '\n');
                 else
                         getline(reader, ss, '\t');
                if (ss[0] == '#')
                {
                        //Skip
                        getline(reader,ss, '\n');i=0;
                        continue;
                }

                i++;
                myvector.push_back(ss);
        }

        reader.close();

        vector<string>::iterator it;
        stringstream stream;
        int vecloc=1;
        string tag;
        string sData;

        cout << "myvector contains: \n";

        for ( it=myvector.begin() ; it < myvector.end(); it++ )
        {
                switch (vecloc)
                {
                case 1: stream << *it;  stream >> tag; vecloc++;break;
                case 2:
                                stream << *it;  stream >> sData;
                                // Do job
                                cout << tag << "   " << sData << "\n";
                                // Reset.
                                vecloc=1;       break;
                default :       break;
                }
                // Clear String stream
        stream.str(""); stream.clear();
        }

        return(0);
}

出力

/home/sr/utl

猫abc.txt

ちょっとC ++は私を夢中にさせます。

/home/sr/utl

a.out abc.txt

myvector には以下が含まれます。

ちょっとC ++

4

3 に答える 3

3

エディターから実際のコードを貼り付け、データファイルに改行(または他の予期しない非印刷文字)がないことを再確認します。

これはここで期待どおりに機能します。

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    stringstream reader("address\t1420 Happy Lane\n");

    string ss;

    getline(reader, ss, '\t');
    cout << "1: " << ss << endl;

    getline(reader, ss, '\n');
    cout << "2: " << ss << endl;
}

出力:

1: address
2: 1420 Happy Lane
于 2010-12-14T01:57:40.323 に答える
0

split()そのために使える機能を手に入れました。\tデリメータとして使用します。

void split(std::string &string, std::vector<std::string> &tokens, const char &delim) {
    std::string ea;
    std::stringstream stream(string);
    while(getline(stream, ea, delim))
        tokens.push_back(ea);
}
于 2010-12-14T01:50:40.217 に答える
0

\t までのグラブと \n までのグラブを交互に実行しようとしています。しかし、'#' コメント行を見つけたときは、あなたの交代が途切れます。

この種のことを処理する最も簡単で確実な方法は、最初に各行を読み取り、次にその行を再解析することです。

于 2010-12-14T06:42:29.707 に答える