我正在尝试解析来自服务器的网络数据,而我正试图找到更多我所拥有的版本。
我的旧代码由for()循环组成,并根据一组转义字符检查字符串的每个字符,并使用字符串流来收集其余字符串。我确信你可以想象,这种循环在阅读网络数据时会导致失败,因为我需要严格的语法检查。
我试图改为开始使用string :: find和string :: substr函数,但我不确定使用它的最佳实现。
基本上,我想从服务器读取一串数据,不同的数据用逗号分隔。 (即,first,lastname,email @ email.com)并用逗号分隔,但读取其间的数据。
有人可以提供任何建议吗?
答案 0 :(得分:0)
我不确定你要解析什么样的数据,但使用多层架构总是一个好主意。每个层应该实现一个抽象函数,每个层应该只做一个作业(比如转义字符)。
您使用的图层数取决于解码流所需的实际步骤
针对您的问题我建议使用以下图层:
1st:用','和'\ n'标记:转换为某种字符串向量
第二名:解决逃脱问题:解码逃生追捕者
你应该使用std :: stringstream,并用循环处理字符。除非您的格式非常简单(只有一个分隔符,没有转义),否则您无法真正使用任何标准函数。
答案 1 :(得分:0)
对于学习体验,这是我最终用于将数据解析为地图的代码。您可以使用web_parse_resurn.err查看是否出现错误,或将其用于特定的错误代码。
struct web_parse_return {
map<int,string> parsedata;
int err;
};
web_parse_return* parsewebstring(char* escapechar, char* input, int tokenminimum) {
int err = 0;
map<int,string> datamap;
if(input == "MISSING_INFO") { //a server-side string for data left out in the call
err++;
}
else {
char* nTOKEN;
char* TOKEN = strtok_s(input, escapechar,&nTOKEN);
if(TOKEN != 0) { //if the escape character is found
int tokencount = 0;
while(TOKEN != 0) {//since it finds the next occurrence, keep going
datamap.insert(pair<int,string>(tokencount,TOKEN));
TOKEN = strtok_s(NULL, escapechar,&nTOKEN);
tokencount++;
}
if(tokencount < tokenminimum) //check that the right number was hit
err++; //other wise, up the error count
}
else {
err++;
}
}
web_parse_return* p = new web_parse_return; //initializing a new struct
p->err = err;
p->parsedata = datamap;
return p;
}