gpt4 book ai didi

c++ - 读取复杂文件以对 string>> C++

转载 作者:行者123 更新时间:2023-11-28 00:45:50 26 4
gpt4 key购买 nike

所以我们基本上想为我们的程序读取一个包含一些不同片段的文本文件:

程序中的结构是一个缓存:pair data>>

文件中的结构是(key既用作键又用作段之间的分隔符)

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

简而言之:问题是我们使用 : 作为 header 的定界符,我想推荐另一个安全的定界符,即它不会在 HTTP 1.0 或 1.1 header 中找到。

最佳答案

您找不到故障保护定界符,因为有人可能总是在数据中使用此参数。

但是,要走的路是在插入数据之前转义数据中出现的任何定界符。这是如何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致力于此。

关于c++ - 读取复杂文件以对 <string,pair<map<string,string> string>> C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16274260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com