关于C语言解析文件的问题

造句大全 2009-08-10 07:31:41
现有一表,创建表结构SQL如下:
create table stu
{
stuno number;
stuname varchar2(21);
stusa DEC(16,2);

}
现有一文件,下面两种格式都可以提供:
stuno 123 stuname abc stusa 99.99
stuno 124 stuname a c stusa 99
stuno 125 stuname a x stusa 88

123 abc 99.99
124 a c 99

要求是,用C语言把这个文件中的各个值解析出来。然后插入到数据表中。

和数据库的操作,已经通过系统提供的函数实现了。现在思路就是用一个循环,把文件的每一行解析出来,然后得到各个字段的值,组装SQL语句就可以了。

目前我用sscanf()函数可以简单的实现,但总觉得有些不太稳定。

请大家提供一种比较好的做法。谢谢了!!

另外,文件的格式可以根据解析的要求,重新组装一下的。
...全文
159 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gz_qmc 2010-06-10
  • 打赏
  • 举报
回复
看了就来气
你干嘛非得在数据中间加哪些个鸟玩意

既然是自己加的,那么怎么加就怎么解
自己写的格式自己不会解读真是滑天下之大稽

中文就当两个字符来处理不就好了?

可怜的娃啊,又是一个只吃第8个饼的人
gz_qmc 2010-06-10
  • 打赏
  • 举报
回复
问题可以分解
读一行数据先进行替换处理
char buf1[1024]="stuno 123 stuname abc stusa 99.99 ";
"stuno ","stuname ","stusa "被删除
则处理过的串就只剩一种格式了
char buf2[1024]="123 abc 99.99";
1 2 3
XXX XXX XXXXXXXX
struct KK
{
char D1[3];
char rev1;
char D2[3];
char rev2
char D3[1016];
}Data;
用memset(&Data,0,1024);清零
用memcpy(&Data,buf2,1024);后
再让rev1=0;rev2=0;就解析完成.
int no=atoi(Data.D1);
char name[4]={0}; memcpy(name,Data.D2,3);
double sa=atof(Data.D3);
yue_gong 2010-06-09
  • 打赏
  • 举报
回复
我在考试中。
飞天御剑流 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 doulyun 的回复:]
格式我定义成:
~1~abc~99.99
~2~a d~88
~3~ a d~89.55

sscanf(buf, "~%[0-9, ]~%[a-z, ]~%[.]", a,b,c);

如果abc 这里是中文时,表达式怎么写.比如
中 国 人

[/Quote]

含有中文的话,你就不能用sscanf这种单字节字符集的函数了,应该用处理宽字符的方法。

但是c标准库对宽字符的支持很弱,这时候转用windows的api比较好。

还有,"~%[0-9, ]~%[a-z, ]~%[.]"这种东西最好不要这样做,看似省事,但是一旦出错你不知道是哪个错了,还得回溯找错。老老实实逐个输入逐个检查就行了。对于你这种时间不敏感的应用,代码的健壮是优先于效率的。
tom56 2009-08-10
  • 打赏
  • 举报
回复
这个恐怕没什么好方法,只能按照规律解析,不过文件完全可以换个格式,定义成这个格式就是给自己找麻烦,XML INI等都很好啊,为什么用这么个格式,万一格式一变,代码全部作废。
造句大全 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 baihacker 的回复:]
C/C++ code//写了一个手动解析的.(最后那个数是反着输出的)//只要把我的输出输入到一个字符串缓冲区里,再用sscanf就能读了..//注意要把反的倒过来...#include<stdio.h>
#include<ctype.h>void parse(constchar* str)
{if (isdigit(str[0])|| str[0]=='.')
{constchar* t;while (*str!='') putchar(*str++);
t=++str;while (*t)++t;--t;printf("");while (*t!='') putchar(*t--);printf("");for (; str!= t;++str) putchar(*str);
}else
{constchar* t;while (*str!='')++str;++str;while (*str!='') putchar(*str++);++str;while (*str!='')++str;
t=++str;while (*t)++t;--t;printf("");while (*t!='') putchar(*t--);--t;printf("");while (*t!='')--t;for (; str!= t;++str) putchar(*str);
}
puts("");
}int main()
{
parse("stuno 123 stuname abc stusa 99.99");
parse("stuno 124 stuname a c stusa 99");
parse("stuno 125 stuname a x stusa 88");
parse("123 abc 99.99");
parse("124 a c 99");return0;
}
[/Quote]


强!!

是可以解析了。但看不懂!
造句大全 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
作为标准库函数,sscanf是可以信赖的。你的问题最大的不确定性来源于文件,文件的分析函数应该对各种可能的错误进行足够的检查并有相应的处理方法。

对于文件的格式,应该用第二种而不是第一种,第一种有很多冗余的没有用的字符,文件的空间被浪费了,可以用一个不可能出现的字符或者尽量短的字符序列作为分隔符就行了。scanf可以用%[]处理非空白字符作分隔符的情况。
[/Quote]


格式我定义成:
~1~abc~99.99
~2~a d~88
~3~ a d~89.55

sscanf(buf, "~%[0-9, ]~%[a-z, ]~%[.]", a,b,c);

如果abc 这里是中文时,表达式怎么写.比如
中 国 人
baihacker 2009-08-10
  • 打赏
  • 举报
回复

//写了一个手动解析的.(最后那个数是反着输出的)
//只要把我的输出输入到一个字符串缓冲区里,再用sscanf就能读了..
//注意要把反的倒过来...
#include <stdio.h>
#include <ctype.h>
void parse(const char* str)
{
if (isdigit(str[0]) || str[0] == '.')
{
const char* t;
while (*str != ' ') putchar(*str++);
t = ++str;
while (*t) ++t;
--t;printf(" ");
while (*t != ' ') putchar(*t--);printf(" ");
for (; str != t; ++str) putchar(*str);
}
else
{
const char* t;
while (*str != ' ') ++str;
++str;
while (*str != ' ') putchar(*str++);
++str;
while (*str != ' ') ++str;
t = ++str;
while (*t) ++t;
--t;printf(" ");
while (*t != ' ') putchar(*t--);
--t;printf(" ");
while (*t != ' ') --t;
for (; str != t; ++str) putchar(*str);
}
puts("");
}


int main()
{
parse("stuno 123 stuname abc stusa 99.99");
parse("stuno 124 stuname a c stusa 99");
parse("stuno 125 stuname a x stusa 88");
parse("123 abc 99.99");
parse("124 a c 99");
return 0;
}
飞天御剑流 2009-08-10
  • 打赏
  • 举报
回复
作为标准库函数,sscanf是可以信赖的。你的问题最大的不确定性来源于文件,文件的分析函数应该对各种可能的错误进行足够的检查并有相应的处理方法。

对于文件的格式,应该用第二种而不是第一种,第一种有很多冗余的没有用的字符,文件的空间被浪费了,可以用一个不可能出现的字符或者尽量短的字符序列作为分隔符就行了。scanf可以用%[]处理非空白字符作分隔符的情况。
jixingzhong 2009-08-10
  • 打赏
  • 举报
回复
定义好你的解析规则,然后根据你的规则读取文件内容就好
jixingzhong 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 doulyun 的回复:]
如果某个字符中间有空格,解析就失败了,特别是中文,所以,目前我就是不让有空格的中文字符串出现,但这样也不太好呀。。
[/Quote]

空格之后就是另外一个字符串了
造句大全 2009-08-10
  • 打赏
  • 举报
回复
如果某个字符中间有空格,解析就失败了,特别是中文,所以,目前我就是不让有空格的中文字符串出现,但这样也不太好呀。。
baihacker 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 doulyun 的回复:]
现有一表,创建表结构SQL如下:
create table stu
{
    stuno number;
    stuname varchar2(21);
    stusa  DEC(16,2);

}
现有一文件,下面两种格式都可以提供:
stuno 123 stuname abc stusa 99.99
stuno 124 stuname a c stusa 99
stuno 125 stuname a x stusa 88

123 abc 99.99
124 a c 99

要求是,用C语言把这个文件中的各个值解析出来。然后插入到数据表中。

和数据库的操作,已经通过系统提供的函数实现了。现在思路就是用一个循环,把文件的每一行解析出来,然后得到各个字段的值,组装SQL语句就可以了。

目前我用sscanf()函数可以简单的实现,但总觉得有些不太稳定。

请大家提供一种比较好的做法。谢谢了!!

另外,文件的格式可以根据解析的要求,重新组装一下的。
[/Quote]

sscanf挺好的,你要相信库函数(虽然有的还是会出问题).
如果要用正则式也行,不过没有必要啊,sscanf就是一个小的正则式引擎.
再不然自己手动解析也行...先strtok

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧