1

サーバーから送られてくる Web データを解析しようとしていますが、私が持っていたもののより stl バージョンを見つけようとしています。

私の古いコードは for() ループで構成され、文字列の各文字を一連のエスケープ文字に対してチェックし、stringstream を使用して残りを収集していました。ご想像のとおり、この種のループは、厳密な構文チェックが必要なため、Web データを読み取るときに障害の最大点になります。

代わりに string::find および string::substr 関数の使用を開始しようとしていますが、それを行うのに最適な実装がわかりません。

基本的に、サーバーからコンマで区切られたさまざまなデータの文字列を読み取りたいと考えています。(つまり、first,lastname,email@email.com) をカンマで区切りますが、その間のデータを読み取ります。

誰でもアドバイスを提供できますか?

4

2 に答える 2

0

解析しているデータの種類はわかりませんが、マルチレイヤーアーキテクチャを使用することをお勧めします。各レイヤーは抽象関数を実装する必要があり、各レイヤーは1つのジョブ(文字のエスケープなど)のみを実行する必要があります。

使用するレイヤーの数は、ストリームをデコードするために必要な実際のステップによって異なります

あなたの問題のために私は次の層を提案します:

1番目:「、」、「\ n」でトークン化:ある種の文字列のベクトルに変換します

2番目:エスケープを解決する:エスケープ文字をデコードする

std :: stringstreamを使用し、ループを使用して文字を処理する必要があります。フォーマットが本当に単純でない限り(エスケープなしの単一の区切り文字のみのように)、標準関数を実際に使用することはできません。

于 2012-08-11T01:18:22.050 に答える
0

学習経験のために、これはデータをマップに解析するために最終的に使用したコードです。web_parse_resurn.err を使用して、エラーが発生したかどうかを確認したり、特定のエラー コードに使用したりできます。

struct web_parse_return {
map<int,string> parsedata;
int err;
};

web_parse_return* parsewebstring(char* escapechar, char* input, int tokenminimum) {                 
int err = 0;
map<int,string> datamap;
if(input == "MISSING_INFO") { //a server-side string for data left out in the call
    err++;
}
else {
    char* nTOKEN;   
    char* TOKEN = strtok_s(input, escapechar,&nTOKEN);
    if(TOKEN != 0) { //if the escape character is found
        int tokencount = 0; 
        while(TOKEN != 0) {//since it finds the next occurrence, keep going
            datamap.insert(pair<int,string>(tokencount,TOKEN));
            TOKEN = strtok_s(NULL, escapechar,&nTOKEN);
            tokencount++;
        }
        if(tokencount < tokenminimum) //check that the right number was hit
            err++; //other wise, up the error count
    }
    else {
        err++;  
    }   
}

web_parse_return* p = new web_parse_return; //initializing a new struct
p->err = err;
p->parsedata = datamap;
return p;
}
于 2012-08-12T07:04:45.040 に答える