C代码怎么高效读取格式化的文本
C代码如何高效读取格式化的文本?
有下面的文本,假定有几十行
f(abc,甲)=丙
f(a,乙)=戊
f(48,丙)=戊
f(阿3,丁)=乙
这是有规律的,框架就是:
f (*,*)=*
我需要把一行中这三个*代表的内容找出来,存到三个字符缓冲区中去。
我自己写的代码特别啰嗦,我知道正则表达式能简单地处理这个问题,但C语言引入正则表达式我不会。所以:
请问除了引入正则表达式处理机制外有没有高效的办法?
------解决思路----------------------
这种貌似用scanf就能搞定了
------解决思路----------------------
------解决思路----------------------
看楼上代码。。。。
------解决思路----------------------
好赞好赞!!!
------解决思路----------------------
赵哥先fgets了一下,肯定会丢掉一行。
可以fgets+sscanf,其他都可以参考赵哥代码。
------解决思路----------------------
f(到,之间的字符放入s1,最多放入39个字符,后面类似。
ANSI C 标准向 scanf() 增加了一种新特性,称为扫描集(scanset)。 扫描集定义一个字符集合,可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。 例如,以下的扫描集使 scanf() 读入字符 A、B 和 C:
%[ABC]
使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时,数组中放置以 null 结尾、由读入字符组成的字符串。
用字符 ^ 可以说明补集。把 ^ 字符放为扫描集的第一字符时,构成其它字符组成的命令的补集合,指示 scanf() 只接受未说明的其它字符。
有下面的文本,假定有几十行
f(abc,甲)=丙
f(a,乙)=戊
f(48,丙)=戊
f(阿3,丁)=乙
这是有规律的,框架就是:
f (*,*)=*
我需要把一行中这三个*代表的内容找出来,存到三个字符缓冲区中去。
我自己写的代码特别啰嗦,我知道正则表达式能简单地处理这个问题,但C语言引入正则表达式我不会。所以:
请问除了引入正则表达式处理机制外有没有高效的办法?
------解决思路----------------------
这种貌似用scanf就能搞定了
------解决思路----------------------
//in.txt:
//f(abc,甲)=丙
//f(a,乙)=戊
//f(48,丙)=戊
//f(阿3,丁)=乙
//
//这是有规律的,框架就是:
//f (*,*)=*
#include <stdio.h>
FILE *f;
char ln[80];
char s1[40];
char s2[40];
char s3[40];
int i;
int main() {
f=fopen("in.txt","r");
if (NULL==f) {
printf("Can not open file in.txt!\n");
return 1;
}
i=0;
while (1) {
if (NULL==fgets(ln,80,f)) break;
if (3==fscanf(f,"f(%39[^,],%39[^)])=%39[^\n]",s1,s2,s3)) {
printf("[%s],[%s],[%s]\n",s1,s2,s3);
} else {
printf("in.txt line %d format error:%s",i+1,ln);
}
i++;
}
fclose(f);
return 0;
}
//[abc],[甲],[丙]
//[a],[乙],[戊]
//[48],[丙],[戊]
//[阿3],[丁],[乙]
//
------解决思路----------------------
看楼上代码。。。。
------解决思路----------------------
好赞好赞!!!
------解决思路----------------------
赵哥先fgets了一下,肯定会丢掉一行。
可以fgets+sscanf,其他都可以参考赵哥代码。
------解决思路----------------------
f(到,之间的字符放入s1,最多放入39个字符,后面类似。
ANSI C 标准向 scanf() 增加了一种新特性,称为扫描集(scanset)。 扫描集定义一个字符集合,可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。 例如,以下的扫描集使 scanf() 读入字符 A、B 和 C:
%[ABC]
使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时,数组中放置以 null 结尾、由读入字符组成的字符串。
用字符 ^ 可以说明补集。把 ^ 字符放为扫描集的第一字符时,构成其它字符组成的命令的补集合,指示 scanf() 只接受未说明的其它字符。