重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
函数名: findfirst(); findnext ();
我们提供的服务有:网站设计制作、成都网站建设、微信公众号开发、网站优化、网站认证、华蓥ssl等。为上1000家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的华蓥网站制作公司
功 能: 搜索磁盘目录; 取得下一个匹配的findfirst模式的文件 ;
用 法:
int findfirst(char *pathname, struct ffblk *ffblk, int attrib);
int findnext(struct ffblk *ffblk);
举例:
/* findnext example */
#include stdio.h
#include dir.h
int main(void)
{
struct ffblk ffblk;
int done;
printf("Directory listing of *.*\n");
done = findfirst("*.*",ffblk,0);
while (!done)
{
printf(" %s\n", ffblk.ff_name);
done = findnext(ffblk);
}
解析器不好做,但在C中有这两个函数可以对字符串和文件指针进行扫描,以下仅为解决方法,并非完整代码:
如你有行char buf[] = "set a=nihao",cont[32]={0};
sscanf(buf,"set a=%s",cont);
或者你的文件指针pf指在set a=nihao行首时用以下语句:
fscanf(pf,"set a=%s",cont);
这样的缺点是文件或字符串必须是严格的"set a=...",而如果是"set a = ..."就扫描不了,语法就很死了,如果你真要处理空格,恐怕要用点sscanf的高级用法,或者是正则表达式,很可惜C没有内建支持之...
这一题的关键是,对于读取到的每一行,怎么获取 PRN。考察的是 sscanf 函数的用法。
首先,整个算法的过程如下:
循环读取文件中的一行,存到一个叫做 line 的变量里面。
通过 sscanf 函数扫描 line, 从中读取 PRN,把 PRN 存到另外一个变量里。
根据 PRN 的值打开相应的文件,把这一行写到里面。
循环结束,每一行内容都根据 PRN 写到相应的文件中去了。
其次,怎么用 sscanf 从 line 中读取 PRN ?
观察文件中的内容,可以看出来,PRN 以字母 C 开头。
在调用 sscanf 扫描 line 的时候,跳过所有不是 C 的字符,然后从那个位置开始读取字符串,于是得到的字符串就是以C开头的 PRN 了。
举个例子,假设一行最多200个字符,存在 line 里面,要读取 PRN,代码如下:
char line[200] = "2018/09/10 00:00:00.0 C01 49.583";
char prn[3];
sscanf(line, "%*[^C]%s", prn);
使用 sscanf 函数,扫描 line, 读取指定格式的内容,存到 prn 中。
来看一下中间那个格式化字符串:"%*[^C]%s",从左到右读:
% 格式化标记。%d 表示数字,%s 表示字符串
%* 忽略(或者说跳过)。%*d 就是说要跳过数字
[] 字符集合。 [a14] 表示字母 a、1 或 4;[a\d] 表示字母 a 或者任意数字
[^] 反向否定。[^C] 表示任意一个非 C 的字符,[\d] 表示任意非数字
所以这个格式化字符串的意思就是,先跳过所有不是 C 的字符,然后扫描一个字符串(%s)
最后,如果不考虑异常情况,这个函数的代码如下: