急,在线等,如何实现将有相同格式的记录做个文件分割?

csdncsdncsdn 2010-11-18 02:33:06
请教弟兄们一个问题
一个有n条记录的文件,
比如说文件A.txt存储以下内容(每一位表示相应的信息,以*号表示未处理的信息位)
123a***
456b***
*789c**
**012**


如果想输出得到如下m个文件(即有相同格式的记录归入同一个文件)
1.txt
123a***
456b***

2.txt
*789c**

3.txt
**012**

怎么用C++实现,谢谢了。


...全文
237 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhwmagus 2012-01-19
  • 打赏
  • 举报
回复
嗯,其实是sscanf("")比较好,因为这个使用了正则式,匹配一般使用正则式
jhzlf 2010-11-23
  • 打赏
  • 举报
回复
好长。。。。。
CandPointer 2010-11-23
  • 打赏
  • 举报
回复
sscanf 里面的 format
可以做一个 char * format[]...

while 里面的 if else if else 该用 while 遍历 format[]

这样,稍微好看些。也方便日后增加其它的扫描格式
赵4老师 2010-11-19
  • 打赏
  • 举报
回复
修改修改比比谁更敏捷也行。
赵4老师 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 szgrape 的回复:]
引用 12 楼 ak_kay 的回复:
引用 4 楼 gules 的回复:
将文件中所有记录读取到string数组中,遍历该数组,判断其所属模式,写入分类文件中。


觉得还是这个快点

每天回帖即可获得10分可用分!


恩,很好用,10楼那一堆的sscanf看着让人头大

用C++和标准库用起来安逸一些
[/Quote]
请拿出源代码来比。还可以运行运行比比效率。
szgrape 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ak_kay 的回复:]
引用 4 楼 gules 的回复:
将文件中所有记录读取到string数组中,遍历该数组,判断其所属模式,写入分类文件中。


觉得还是这个快点

每天回帖即可获得10分可用分!
[/Quote]

恩,很好用,10楼那一堆的sscanf看着让人头大

用C++和标准库用起来安逸一些
ak_kay 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gules 的回复:]
将文件中所有记录读取到string数组中,遍历该数组,判断其所属模式,写入分类文件中。
[/Quote]

觉得还是这个快点

每天回帖即可获得10分可用分!
lookupheaven 2010-11-19
  • 打赏
  • 举报
回复
静观高手舞大刀
赵4老师 2010-11-19
  • 打赏
  • 举报
回复
谢谢楼上!
重构:
//一个有n条记录的文件,
//比如说文件A.txt存储以下内容(每一位表示相应的信息,以*号表示未处理的信息位)
//123a***
//456b***
//*789c**
//**012**
//
//如果想输出得到如下m个文件(即有相同格式的记录归入同一个文件)
//1.txt
//123a***
//456b***
//
//2.txt
//*789c**
//
//3.txt
//**012**
#include <stdio.h>
FILE *fi,*fo[3];
char c,n;
char fn[40];
char buf[40];
int ln,i;
int main() {
fi=fopen("A.txt","r");
if (NULL==fi) {
printf("Can not find file A.txt!\n");
return 1;
}
for (i=0;i<3;i++) {
sprintf(fn,"%d.txt",i+1);
fo[i]=fopen(fn,"w");
if (NULL==fo[i]) {
_fcloseall();
printf("Can not create file %s!\n",fn);
return 2;
}
}
ln=0;
while (1) {
if (NULL==fgets(buf,40,fi)) break;
ln++;
if (4==sscanf(buf,"123a%c%c%c%c" ,&c,&c,&c, &n) && '\n'==n) fprintf(fo[0],"%s",buf);
else if (4==sscanf(buf,"456b%c%c%c%c" ,&c,&c,&c, &n) && '\n'==n) fprintf(fo[0],"%s",buf);
else if (4==sscanf(buf,"%c789c%c%c%c" ,&c,&c,&c, &n) && '\n'==n) fprintf(fo[1],"%s",buf);
else if (5==sscanf(buf,"%c%c012%c%c%c",&c,&c,&c,&c,&n) && '\n'==n) fprintf(fo[2],"%s",buf);
else printf("File A.txt line %d format error, ignored!\n",ln);
}
_fcloseall();
return 0;
}
赵4老师 2010-11-18
  • 打赏
  • 举报
回复
楼主就不能把我的代码当架构使吗?
赵4老师 2010-11-18
  • 打赏
  • 举报
回复
只有变化才是不变的。
敏捷的精华就是拥抱变化。
赵4老师 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 csdncsdncsdn 的回复:]
老大,这个程序里面好像限制了只能输出3个文件,而且字符串的长度好像也被限制了,要是在原A.txt文件中的字符串长度超出你设定的范围,或者不同形式的记录超过3种,这个程序好像不太灵光,你能不能帮人帮到底,送佛送到西,改进一下,谢谢了。
[/Quote]
过度设计是程序员的通病。
csdncsdncsdn 2010-11-18
  • 打赏
  • 举报
回复
我不是太懒,写程序应该有一定的通用性吧,就像一个标准件,拿到哪个地方,装上就能用,
总不能每次都去改参数,那也太烦了吧。
gules 2010-11-18
  • 打赏
  • 举报
回复
将文件中所有记录读取到string数组中,遍历该数组,判断其所属模式,写入分类文件中。
luciferisnotsatan 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhao4zhong1 的回复:]

C/C++ code
//一个有n条记录的文件,
//比如说文件A.txt存储以下内容(每一位表示相应的信息,以*号表示未处理的信息位)
//123a***
//456b***
//*789c**
//**012**
//
//
//如果想输出得到如下m个文件(即有相同格式的记录归入同一个文件)
//1.txt
//123a***
//456b***
//
//2.txt
//*789c**
……
[/Quote]
按这代码自己改下不就行了,lz太懒了
csdncsdncsdn 2010-11-18
  • 打赏
  • 举报
回复
老大,这个程序里面好像限制了只能输出3个文件,而且字符串的长度好像也被限制了,要是在原A.txt文件中的字符串长度超出你设定的范围,或者不同形式的记录超过3种,这个程序好像不太灵光,你能不能帮人帮到底,送佛送到西,改进一下,谢谢了。
赵4老师 2010-11-18
  • 打赏
  • 举报
回复
//一个有n条记录的文件,
//比如说文件A.txt存储以下内容(每一位表示相应的信息,以*号表示未处理的信息位)
//123a***
//456b***
//*789c**
//**012**
//
//
//如果想输出得到如下m个文件(即有相同格式的记录归入同一个文件)
//1.txt
//123a***
//456b***
//
//2.txt
//*789c**
//
//3.txt
//**012**
#include <stdio.h>
FILE *fi,*fo[3];
char c,n;
char fn[40];
char buf[40];
int ln,i;
int main() {
fi=fopen("A.txt","r");
if (NULL==fi) {
printf("Can not find file A.txt!\n");
return 1;
}
for (i=0;i<3;i++) {
sprintf(fn,"%d.txt",i+1);
fo[i]=fopen(fn,"w");
if (NULL==fo[i]) {
_fcloseall();
printf("Can not create file %s!\n",fn);
}
}
ln=0;
while (1) {
if (NULL==fgets(buf,40,fi)) break;
ln++;
if (4==sscanf(buf,"123a%c%c%c%c",&c,&c,&c,&n)) {
if ('\n'==n) fprintf(fo[0],"%s",buf);
else printf("File A.txt line %d format error, ignored!\n",ln);
} else
if (4==sscanf(buf,"456b%c%c%c%c",&c,&c,&c,&n)) {
if ('\n'==n) fprintf(fo[0],"%s",buf);
else printf("File A.txt line %d format error, ignored!\n",ln);
} else
if (4==sscanf(buf,"%c789c%c%c%c",&c,&c,&c,&n)) {
if ('\n'==n) fprintf(fo[1],"%s",buf);
else printf("File A.txt line %d format error, ignored!\n",ln);
} else
if (5==sscanf(buf,"%c%c012%c%c%c",&c,&c,&c,&c,&n)) {
if ('\n'==n) fprintf(fo[2],"%s",buf);
else printf("File A.txt line %d format error, ignored!\n",ln);
} else printf("File A.txt line %d format error, ignored!\n",ln);
}
_fcloseall();
return 0;
}

记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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