首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

读取文件,解析,存入结构体。解决方案

2012-03-25 
读取文件,解析,存入结构体。用getline()从文件中读取一行数据,用strtok()截取后放到结构体中。逗号间没有数

读取文件,解析,存入结构体。
用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:// <>, <>, <>, <>, 


[解决办法]

探讨

用boost::tokenizer.
http://www.boost.org/doc/libs/1_39_0/libs/tokenizer/char_separator.htm

[解决办法]
你需要知道每一个数据的意义,然后才能决定数据结构。
[解决办法]
那你放入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中
[解决办法]
探讨

老大让我先放到结构体,再push到vector,HELP。

[解决办法]
都是有时间的哇啊,写那么长的代码,顶啊!
[解决办法]
一行一行的读取,存入CString ,用Find.(“,”)有就直接存,没有就存0;再搞一个循环就可以了!
[解决办法]
探讨

都是有时间的哇啊,写那么长的代码,顶啊!

[解决办法]
vector里面的数据如何输出?
[解决办法]
表示菜鸟难以理解以上回复~
[解决办法]
探讨

那先补零保存到结构体吧。
老大让我定义一个结构体里面再定义59个char *;
我都快疯了

[解决办法]
这个程序是经过测试的,可以用。不过遗憾的是,它目前处理不了中文和日文字符。
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;}
[解决办法]
探讨
用getline()从文件中读取一行数据,用strtok()截取后放到结构体中。

逗号间没有数据的赋0值保存到结构体

逗号后没有数据的也赋0值再存入结构体。

这是数据:
21,0x10,28,0,1,1,1,,,,,,,,,17,,,,,,,6,0xE70C,,,,,,,,,,,,,,,,,8,8,8,8,8,8,8,,,,,,,,,,交差点名称,交差点名称,
.
.
.……

[解决办法]
哈,上面的程序,你直接重定向,就能处理中文日文字符哦。


[解决办法]

探讨

重定向,没听过诶

[解决办法]
你查查strseq()这个函数!!也许对你更有帮助!
[解决办法]
探讨

恩,Jim我
我看不懂你写的额,
我去找找strseq();

[解决办法]
要是我做,就把行字符的从头遍历一遍,用两个变量标识位置然后截取,嘻嘻。。
[解决办法]
探讨

是这样吗 a.out <data.txt >out.txt ?

[解决办法]
很可能是编码问题。
你尝试一下把wstring全换成string,wchar_t换成char,L"..."换成"..."试试看。
[解决办法]
补0不是解析器的责任。是使用vector的对象的责任。当你从vector取出一个空字符串对象的时候,就把它解释成0。

热点排行