したがって、基本的には、いくつかの異なるセグメントで構成されるテキスト ファイルをプログラムに読み込もうとします。
プログラム内の構造は次のキャッシュです: ペア データ> >
ファイルの構造は次のとおりです(キーは、キーとセグメント間の区切り文字の両方として使用されます)
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 ヘッダーでは検出されない、フェイルセーフな別の区切り記号を提案してください。