读取文件,解析,存入结构体。
用getline()从文件中读取一行数据,用strtok()截取后放到结构体中。
逗号间没有数据的赋0值保存到结构体
逗号后没有数据的也赋0值再存入结构体。
这是数据:
21,0x10,28,0,1,1,1,,,,,,,,,17,,,,,,,6,0xE70C,,,,,,,,,,,,,,,,,8,8,8,8,8,8,8,,,,,,,,,,交差点名称,交差点名称,
.
.
.
结构体是这样的
struct _struct
{
string s1;
string s2;
.
.
.
string s59;
}
求代码。
[解决办法]
strtok() 貌似会忽略两个连续的逗号
[解决办法]
用boost::tokenizer.
http://www.boost.org/doc/libs/1_39_0/libs/tokenizer/char_separator.htm
[解决办法]
仅供参考
- C/C++ code
#include <stdio.h>#include <string.h>char string[80];char seps1[3];char seps2[3];char *token;char *zzstrtok ( char *string, const char *control1,//连续出现时视为中间夹空token const char *control2 //连续出现时视为中间无空token ){ unsigned char *str; const unsigned char *ctrl1 = (const unsigned char *)control1; const unsigned char *ctrl2 = (const unsigned char *)control2; unsigned char map1[32],map2[32]; static char *nextoken; static char flag=0; unsigned char c; int L; memset(map1,0,32); memset(map2,0,32); do { map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7)); } while (*ctrl1++); do { map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7)); } while (*ctrl2++); if (string) { if (control2[0]) { L=strlen(string); while (1) { c=string[L-1]; if (map2[c >> 3] & (1 << (c & 7))) { L--; string[L]=0; } else break; } } if (control1[0]) { L=strlen(string); c=string[L-1]; if (map1[c >> 3] & (1 << (c & 7))) { string[L]=control1[0]; string[L+1]=0; } } str=(unsigned char *)string; } else str=(unsigned char *)nextoken; string=(char *)str; while (1) { if (0==flag) { if (!*str) break; if (map1[*str >> 3] & (1 << (*str & 7))) { *str=0; str++; break; } else if (map2[*str >> 3] & (1 << (*str & 7))) { string++; str++; } else { flag=1; str++; } } else if (1==flag) { if (!*str) break; if (map1[*str >> 3] & (1 << (*str & 7))) { *str=0; str++; flag=0; break; } else if (map2[*str >> 3] & (1 << (*str & 7))) { *str=0; str++; flag=2; break; } else str++; } else {//2==flag if (!*str) return NULL; if (map1[*str >> 3] & (1 << (*str & 7))) { str++; string=(char *)str; flag=0; } else if (map2[*str >> 3] & (1 << (*str & 7))) { str++; string=(char *)str; } else { string=(char *)str; str++; flag=1; } } } nextoken=(char *)str; if (string==(char *)str) return NULL; else return string;}void main(){ strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some more tokens, "); strcpy(seps1,",\n");strcpy(seps2," \t"); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,"1234| LIYI|China | 010 |201110260000|OK"); strcpy(seps1,"|");strcpy(seps2," "); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,"1234|LIYI||010|201110260000|OK"); strcpy(seps1,"");strcpy(seps2,"|"); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,"1234|LIYI||010|201110260000|OK"); strcpy(seps1,"|");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,"a"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,"a,b"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,"a,,b"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,",a"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,"a,"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,",a,,b"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,",,a,,b,,"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,","); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,",,"); strcpy(seps1,",");strcpy(seps2,""); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); } strcpy(string,",,,"); strcpy(seps1,",");strcpy(seps2," "); printf("\n[%s]\nTokens:\n",string); token=zzstrtok(string,seps1,seps2); while (token!=NULL) { printf(" <%s>",token); token=zzstrtok(NULL,seps1,seps2); }}////[A string of ,,tokens////and some more tokens,]//Tokens:// <A>, <string>, <of>, <>, <tokens>, <>, <and>, <some>, <more>, <tokens>, <>,//[1234| LIYI|China | 010 |201110260000|OK]//Tokens:// <1234>, <LIYI>, <China>, <010>, <201110260000>, <OK>,//[1234|LIYI||010|201110260000|OK]//Tokens:// <1234>, <LIYI>, <010>, <201110260000>, <OK>,//[1234|LIYI||010|201110260000|OK]//Tokens:// <1234>, <LIYI>, <>, <010>, <201110260000>, <OK>,//[a]//Tokens:// <a>,//[a,b]//Tokens:// <a>, <b>,//[a,,b]//Tokens:// <a>, <>, <b>,//[,a]//Tokens:// <>, <a>,//[a,]//Tokens:// <a>, <>,//[,a,,b]//Tokens:// <>, <a>, <>, <b>,//[,,a,,b,,]//Tokens:// <>, <>, <a>, <>, <b>, <>, <>,//[,]//Tokens:// <>, <>,//[,,]//Tokens:// <>, <>, <>,//[,,,]//Tokens:// <>, <>, <>, <>,
[解决办法]
[解决办法]
你需要知道每一个数据的意义,然后才能决定数据结构。
[解决办法]
那你放入vector<string>好了。
- C/C++ code
std::string str = "21,0x10,28,0,1,1,1,,,,,,,,,17,,,,,,,6,0xE70C,,,,,,,,,,,,,,,,,8,8,8,8,8,8,8,,,,,,,,,,交差点名称,交差点名称,"; typedef boost::tokenizer<boost::char_separator<char> > tokenizer; boost::char_separator<char> sep(",", 0, boost::empty_token_policy::keep_empty_tokens); tokenizer tokens(str, sep); vector<string> str_tokens(tokens.begin(), tokens.end());
[解决办法]
这种操作建议自己写一个字符串解析函数,然后把它存入的struct中
[解决办法]
[解决办法]
都是有时间的哇啊,写那么长的代码,顶啊!
[解决办法]
一行一行的读取,存入CString ,用Find.(“,”)有就直接存,没有就存0;再搞一个循环就可以了!
[解决办法]
[解决办法]
vector里面的数据如何输出?
[解决办法]
表示菜鸟难以理解以上回复~
[解决办法]
[解决办法]
这个程序是经过测试的,可以用。不过遗憾的是,它目前处理不了中文和日文字符。
- C/C++ code
#include "stdafx.h"#include <boost/tokenizer.hpp>#include <boost/token_iterator.hpp>#include <vector>#include <string>#include <iterator>#include <iostream>#include <algorithm>#include <cassert>using boost::tokenizer;using boost::char_separator;using boost::keep_empty_tokens;using std::vector;using std::wstring;using std::wcin;using std::wcout;using std::istreambuf_iterator;using std::ostream_iterator;using std::copy;int _tmain(int argc, _TCHAR* argv[]){ istreambuf_iterator<wchar_t> stream_begin(wcin.rdbuf()); istreambuf_iterator<wchar_t> stream_end; typedef tokenizer< char_separator<wchar_t>, istreambuf_iterator<wchar_t>, wstring> tkz; char_separator<wchar_t> sep(L",", 0, keep_empty_tokens); tkz tokens(stream_begin, stream_end, sep); vector<wstring> str_tokens(tokens.begin(), tokens.end()); copy(str_tokens.begin(), str_tokens.end(), ostream_iterator<wstring, wchar_t>(wcout, L"\n")); return 0;}
[解决办法]
[解决办法]
哈,上面的程序,你直接重定向,就能处理中文日文字符哦。
[解决办法]
[解决办法]
你查查strseq()这个函数!!也许对你更有帮助!
[解决办法]
[解决办法]
要是我做,就把行字符的从头遍历一遍,用两个变量标识位置然后截取,嘻嘻。。
[解决办法]
[解决办法]
很可能是编码问题。
你尝试一下把wstring全换成string,wchar_t换成char,L"..."换成"..."试试看。
[解决办法]
补0不是解析器的责任。是使用vector的对象的责任。当你从vector取出一个空字符串对象的时候,就把它解释成0。