1

アプリケーションに適したアルゴリズムとコンテナー クラスを知りたいです。サーバーに一連のファイル (.txt) が含まれるクライアント サーバー通信システムを構築しようとしています。ファイル構造(プロトタイプ)は次のようになります。

A|B|C|D....|Z$(some integer value)#(some integer value). 再び の内容A to Za1_a2_a3_a4......aN|b1_b2_b3_b4......bN|......|z1_z2_z3_z4.....zN. だから私がやりたかったのは、サーバーアプリケーションが開始されたときに、これらのファイルを1つずつロードし、各ファイルの内容をコンテナクラスに保存し、ファイルの内容を区切り文字に基づいて特定の変数に保存することです。

for (int i=0; i< (Number of files); i++) 
{
1) Load the file[0] in Container class[0];
2) Read the Container class[0] search for occurences of delimiters "_" and "|"
3) Till next "|" occurs, save the value occurred at "_" to an array or variable (save it in a buffer)
4) Do this till the file length completes or reaches EOF
5) Next read the second file, save it in Container class[1] and follow the steps as in 2),3) and 4)
}

私の要件に合っているかどうVectorか知りたいですか?Map区切り文字の出現箇所とpush_backそれらを検索し、必要に応じてアクセスする必要があるため。

単一のファイル全体をブロックとして読み取り、バッファで操作することはできますか、またはファイルの読み取り専用を使用しseekgて値をスタックにプッシュできますか? 実装がより良く、より簡単になるものはどれですか? を使用する可能性は何regexですか?

4

1 に答える 1

1

入力の形式とそのサイズに応じて、入力の読み取りと解析のために次の行に沿って何かを行うことをお勧めします。

void ParseOneFile (std::istream & inp)
{
    std::vector<std::vector<std::string>> data;
    int some_int_1 = 0, some_int_2 = 0;

    std::string temp;

    data.push_back ({});
    while (0 == 0)
    {
        int c = inp.get();

        if ('$' == c)
        {
            data.back().emplace_back (std::move(temp));
            break;
        }
        else if ('|' == c)
        {
            data.back().emplace_back (std::move(temp));
            data.push_back ({});
        }
        else if ('_' == c)
            data.back().emplace_back (std::move(temp));
        else
            temp += char(c);
    }

    char sharp;
    inp >> some_int_1 >> sharp >> some_int_2;
    assert ('#' == sharp);

    // Here, you have your data and your two integers...
}

上記の関数は、抽出した情報を返さないため、それを変更する必要があります。ただし、ファイルの 1 つを、 という文字列のベクトルdataと 2 つの整数 (some_int_1some_int_2.) のベクトルに読み取ります。C++11 を使用し、処理とメモリの両方の点で、この読み取りと解析を非常に効率的に行います。

また、上記のコードは、入力ファイルのエラーや書式の不一致をチェックしません。

さて、データ構造の問題について。私はあなたのデータの性質について何も知らないので、はっきりとは言えません。私が言えることは、2 次元配列と 2 つの整数がこのデータに自然に適合するように感じられるということだけです。いくつかのファイルがあるので、それらすべてをベクターの別の次元 (またはmap、ファイル名を次のようなデータ構造にマッピングする ) に格納できます。

struct OneFile
{
    vector<vector<string>> data;
    int i1, i2;
};

vector<OneFile> all_files;
// or...
// map<string, OneFile> all_files;

上記の関数は、OneFile上記の構造体の 1 つのインスタンスを埋めます。

例として、1 番目のファイルのall_files[0].data[0][0]データ項目A0を参照する文字列と、8 番目のファイルのall_files[7].data[25][3]データ項目Z3を参照する別の文字列になります。

于 2013-07-10T06:26:48.670 に答える