sscanf 从文件中直接解析数据

一般从文件中读取内容,我会这样用。

 

 

 

就是每次从文件中取一行数据,然后用sscanf 来解析。

之前只是用来处理一些简单的数据格式,如果遇到复杂的,就先存到一个CString对象里面,再进行解析。

 

今天遇到了一组数据,自己就想彻底了解下sscanf 这个函数能有多大的解析能力。

网上摘录信息如下:

 

      1. 常见用法。  

char buf[512] ;  

sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!  

printf("%s/n", buf);  

结果为:123456  

 

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。  

sscanf("123456 ", "%4s", buf);  

printf("%s/n", buf);  

结果为:1234  

 

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。  

sscanf("123456 abcdedf", "%[^ ]", buf);  

printf("%s/n", buf);  

结果为:123456  

 

4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。  

sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);  

printf("%s/n", buf);  

结果为:123456abcdedf 

 

当输入:  

sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);  

printf("%s/n",buf);  

结果为:123456  

 

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。  

sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);  

printf("%s/n", buf);  

结果为:123456abcdedf  

 

6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中 

      sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);  

printf("%s/n", buf);  

结果为:12DDWDFF  

 

7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)  

sscanf(“hello, world”, "%*s%s", buf);  

printf("%s/n", buf);  

结果为:world  

%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

    如果没有空格则结果为NULL。

 

这些已经是对sscanf的功能进行了非常详细的解释。但是我在遇到下面一组数据格式时,却出现了问题:

数据格式: length1=CSB024-1 CSB024-5

这是文件中的一行数据,我解析的方法是 sscanf( cbuff, "%[^=]=%s %s,strName1,strName2);

这时的数据都在cbuff里面。可是得到的结果是strName1 = strName2 = “CSB024-5”;

这就非常奇怪,而且如果这一行数据里面如果有数字,比如int,double型数据,都可以解析正确。唯独字符串解析不对!!!

 

经过反复实验,最后发现原来不是sscanf的问题,而是CString的问题,如果将strName1,strName2换成是char*,则就没问题。

对于这种错误,实在让人很崩溃!以后用sscanf函数解析时,先用char*类型的对象来获取,再付给CString对象吧!

 

补充1:

今晚快结束时,又发现一个不可理解之处:

在使用sscanf( cbuff, "%[^=]=%s,strName);时,如果strName是CString类型对象,在程序退出时会出现错误,具体错误可以自己试验。换成char*,就不会有,真是万分奇怪!!!

 

补充2:

今天在用到时,又加深了理解,并将其更推广到一些字符串解析领域

CString strFileName = "Oritation3D3";

“Oritation3D”是个独立的字符串,后面的数字是额外增加的后缀。这样,每次需要解析出独立的字符串,然后得到后面的后缀数字。

通过前面对 sscanf 函数的学习,我是这样使用的,虽然结果是达到了,但只是曲线求国,仍需很大改进。

 

 

 

结果: m_nDataNameNum = 3;

这样,就得到了后缀数字。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值