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

怎么用C代码高效地读取固定格式的文本文件

2012-04-12 
如何用C代码高效地读取固定格式的文本文件?姓名年龄电子信箱语文数学张三15zhangsan@1.net95.567.3//这是

如何用C代码高效地读取固定格式的文本文件?
姓名年龄电子信箱语文数学
张三15zhangsan@1.net95.567.3     //   这是注释
李四12lisi@2.net36.299.9     /*   这样的注释也行
王五23wangwu@3.net7098         */
……

其中,空白部分是空格或者Tab键,注释的部分不作为数据读出。
显然,每一行数据是一条记录。我就定义一个结构体数组,数组的每一个元素用来存放一个记录。

如果没有C格式或者C++格式的注释,我自己会写程序读出来这些数据。问题是,在允许数据文件中出现上述两种注释的情况下,如何高效地读取这一行一行的数据到结构体数组当中去呢?请高手赐教。


[解决办法]
先getline,再处理.
[解决办法]
char buffer[],*p;
while(...){
fgets(fp, buffer);
p=buffer;
查找buffer中的//或者/* ,替换成 '\0 '
或查找*/ ,移动p到该位置
sscanf(p, ...);
...
}
[解决办法]
试试采用词法分析的方法,虽然有点牛刀的味道,但应该可以解决问题的。
再次觉得xml的伟大了
[解决办法]
有没有这种情况:
张三12 /* zs@1.net
*/ zs@2.com36.299.9
李四12lisi@2.net36.299.9

fgets后,可以先把注释的删了,处理成标准格式,再用sscanf
分几种情况讨论,不是很难,有些麻烦而已
[解决办法]
这个东东貌似很烦啊
/* //
// /*
//

存在的情况太多,/* 和//的优先级还不一定
[解决办法]
应该是先读到的优先
读到//直接赋 '\0 '
读到/*作个标记,一行一行寻找*/,如果在一行内,就用后面的覆盖这段,
不在一行的就一个换成 '\0 ',另一个指针偏移
再用sscanf
总之,讨论一下就能解决
用正则不能一次解决,效率反而低了
[解决办法]
有点麻烦,只能边读取(一行一行的读取),边处理注释,
[解决办法]
懒人总是用lex

[解决办法]
C/C++编译器处理代码的时候是需要经过很多部骤的,就是说要扫描代码好几次才能进行编译处理的.你也可以这么做,首先把里面的注释去掉.怎么去呢?利用状态机一个个字符的读,当进入到//状态的时候就丢弃该行后面的内容,读到/*的时候就丢弃后面的字符直到读取到*/为止.你要反复处理几次,直到没有注释了为止.然后再getline逐行处理.
[解决办法]
如果没有注释,同时确保里面格式没有错的可能,同时也不会增加额外的需求的前提下可以考虑用sscanf或者getline,实际上底层还是逐字读的阿,只不过读到\n就返回给你而已,我觉得从效率上来说不会有明显得区别.
[解决办法]
jf
闪人~
[解决办法]
sscanf的返回值是实际得到符合类型的参数个数,如果个数不符合就是格式错误
[解决办法]
这种情况下还是用strtok好些

热点排行