0

したがって、基本的には、いくつかの異なるセグメントで構成されるテキスト ファイルをプログラムに読み込もうとします。

プログラム内の構造は次のキャッシュです: ペア データ> >

ファイルの構造は次のとおりです(キーは、キーとセグメント間の区切り文字の両方として使用されます)

key
headerKey : headerValue
headerKey : headerValue
......................
headerKey : headerValue
key
data
data
...
data
key

以下を使用してこれを読み取ろうとしましたが、日付形式 (RFC1123) を読み取れません。「08 Gmt」または同様の「XX gmt」として、headerValues の日付のみを取得します。私たちの読み取りアルゴリズムのどこが間違っているかというと、以下では区切り文字として : を使用していますが、日付形式では異なる意味で表示されていることです。つまり、時間を分割しています。

    try{

                // Create stream
                ifstream ifs(this->cacheFile.c_str(), ios::binary);

                // Read file to cache if stream is good
                if(ifs.good()){
                    while (! ifs.eof() ){
                        map<string,string> headerPairs;
                        string tmp;
                        string key;
                        string data;

                        getline(ifs, tmp);
                        while(tmp.empty()){
                            getline(ifs, tmp);
                            cout << "Empty line..." << "\n";
                            if(ifs.eof()){
                                cout << "End of File.."<< "\n";
                                break;
                            }
                        }

                        //After empty lines get "Key"
                        key = tmp;
                        getline(ifs, tmp);

                        //Get segment of header pairs
                        while(tmp != key){
                            StringTokenizer headerPair(tmp, ":", StringTokenizer::TOK_TRIM);
                            //StringTokenizer::Iterator it = headerPair.begin();
                            std::cout << *(headerPair.begin()) <<": " << *(headerPair.end()-1)<< std::endl;
                            string headerKey = *(headerPair.begin());
                            string headerValue = *(headerPair.end()-1);

                            headerPairs.insert(make_pair(headerKey, headerValue));
                            getline(ifs, tmp);
                        }

                        cout << "Added " << headerPairs.size() << " header pairs from cache" << "\n";
                        //tmp equals Key

                        while(tmp!=key){
                            getline(ifs, tmp);
                            cout << "Searching for header->data delimiter" << "\n";
                        }
                        cout << "Found header->data delimiter" << "\n";

                        //Get segment of data!
                        getline(ifs, tmp);
                        while(tmp != key){ 
                            data+=tmp;
                            getline(ifs, tmp);
                        }

                        cout << "DATA: " << data << "\n";
                        cout << "Ending delimiter:" << tmp << "\n";

                        this->add(key,make_pair(headerPairs, data));
                        cout << "Added: " << key << " to memory-cache" << endl;

                    }
                    ifs.close();
                }

            }
            catch (Exception &ex){
                cerr << ex.displayText() << endl;
            }

日付文字列を取得するより良い方法を提案してください:

 DateTime now : Mon, 29 Apr 2013 08:15:57 GMT
 DateRetrieved from file: 57 GMT

要するに: 問題は、ヘッダーの区切り記号として : を使用していることです。HTTP 1.0 または 1.1 ヘッダーでは検出されない、フェイルセーフな別の区切り記号を提案してください。

4

1 に答える 1

3

誰かが常にデータでこのパラメーターを使用する可能性があるため、フェールセーフ区切り文字を見つけることができません。

ただし、データを挿入する前に、データ内の区切り文字の出現をエスケープする方法があります。CSVで行う方法は次のとおりです。

"Date","Pupil","Grade"
"25 May","Bloggs, Fred","C"
"25 May","Doe, Jane","B"
"15 July","Bloggs, Fred","A"
"15 April","Muniz, Alvin ""Hank""","A"

(二重引用符がデータ内にあり、エスケープする必要がある場合は、二重 "" に注意してください)

文字を二重にするこの方法が一般的に使用されている場合でも、区切り文字をエスケープする最も一般的な方法は、文字の前にバックスラッシュ '\' を追加することです。

これについて詳しく知りたい場合は、これに特化したウィキペディアのページをご覧ください。

于 2013-04-29T09:09:13.740 に答える