2013-04-29 50 views
0

所以我們基本上要閱讀由一些不同的細分我們的節目的文本文件:閱讀複雜的文件配對<串,對<地圖<字符串,字符串>字符串>> C++

在結構方案是一個高速緩存與:對數據>>

在文件中的結構(均密鑰被用作既密鑰和段之間的分隔符)

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

我們一直在努力此使用讀取以下,但它不讀取日期格式(RFC1123)。我們只將headerValues中的日期定爲「08 Gmt」或類似的「XX gmt」。什麼是錯在我們的閱讀算法,下面是我們正在使用:作爲分隔符,但它出現在日期格式不同的含義,即分割時間:

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頭。

回答

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" 

(注意雙「」當雙引號中的數據,並需要進行轉義)即使字符加倍這種方法常用

,逃避你的分隔符的最流行的方式是在字符前加一個反斜槓'\'。

如果你想了解更多關於此,你可以看看Wikipedia page致力於此。

+0

根據[this](http://stackoverflow.com/questions/4400678/http-header-should-use-what-c​​haracter-encoding)標題要包含一些跡象。我們決定在文件中使用這個(✰)特殊字符來分隔標題✰ – 2013-04-29 09:51:31

+0

@DavidKarlsson但是如果用戶在數據字段中使用這個字符呢?這仍然是不安全的。 – 2013-04-29 10:25:12

+0

StringTokenizer僅用於標題段,該段使用多字符鍵與其他段分隔開......因此,數據段不受該字符的拆分// BR – 2013-04-29 10:44:28

相關問題