急盼高人指点,本人感激涕零!!!!
大概思路:
前提:用户输入规律的时候每个条件必须以回车结束
一.信息块定义:
1.信息快是从某个文件中按照一定的规律查找到的信息
2.提取信息的规律是客户输入的规律
3.一个信息块可以由若干个字符串或若干个子信息块组成
二.难点
1.需要分析客户输入的规律,从客户输入的规律中找关键字符串,还要找到目标文件的信息。
example:(从目标文件1中查找符合下面规律的信息)
(规律)回车+客户号码1+回车+**********+客户信息(子信息块:回车+客户号码2
回车+**********+客户名称2+回车)+客户名称1+ 回车
(结果)回车+客户号码1+(目标文件中和客户号码1相匹配的字符串后面的字符串,到???????????结束)+回车+**********+客户信息(子信息块:回车+客户号码2++(目标文件中和客户号码2相匹配的字符串后面的字符串,到???????????结束)+回车+**********+客户名称1+(目标文件中和客户名称1相匹配的字符串后面的字符串,到???????????结束)+回车
例如:
用户输入:
纳税人识别号:
##########
纳税人名称:
查询目标文件(目标文件中有若干条记录,是从某个软件的日志中备份出来的文本文件)得到的输出结果应为:
纳税人识别号:4101111111111
##########
纳税人名称:河南软件公司
纳税人识别号:4101111111112
##########
纳税人名称:上海软件公司
纳税人识别号:4101111111113
##########
纳税人名称:深圳软件公司
...........
以下是我涂鸦的几行代码,请高人修改。多谢!!!!
#pragma warning(disable:4786)
#include <string>
# include <iostream>
# include <stdio>
# include <list>
#include <vector>
#include <algorithm>
//用户输入的规律必须每次要输入空格
using namespace std;
void main()
{
typedef vector<string> glVector();//规律数组glVector()用语存放规律
typedef vector<string> xxVector();//信息数组xxVector()用于存放提取出来的信息
typedef glVector::iterator glIT;//当前指针
strIT start,end,it;
start=glVector.begin ();
end=glVector.end ();
string s1;
string *wj=file(wjvector);//行指针*wj指向文件的首行
string *gl=file(glvector());//行指针gl指向用户输入的规律
cout << "Enter a sentence (以空格和回车为结束符号):";//用户输入规律
int i_line = 0;
while(true)
{
if(strstr("glvector", "\r\n"))
i_line++;
else
{
return i_line;
break;
}
} //统计客户输入规律的行数(关键字的个数)
int i_line1 = 0;
while(true)
{
if(strstr("wenjian", "\r\n"))
i_line1++;
else
{
return i_line1;
break;
}
}
const int size = i_line;//盛放规律的数组长度
const int size1 =i_line1;//盛放信息的数组长度
strVector glVector(size);//规律组
string value("aaa");//初始化为aaa
strVector wjVector(size1);//文件组
string value("bbb");//初始化为bbb
for(int i=0;i<i_line;i++)
{
string glline=getline(cin,s1, ' ');
glvector[i]=glline;//把每行的规律作为规律数组的一个元素
*gl++;//每次循环都指向下一行
for(int j=0;j<i_line1;j++)
{
string value("bbb");
string wjline=getline(wenjian,s1, '\n');//回车作为一行的结束符号(必须是一行一种信息)
wjvector[j]=wjline;//把每行的文件作为文件数组的一个元素
strstr("wjvector[j]",glvector[i]);
if(strstr("wjvector[j]",glvector[i])=true)//匹配成功
{
cout<<wjvector[j]<<"\r\n"<<endl;
}
*wj++;
else
{
*wj++;
continue;
}
}
else
cout<<"你的查询条件找不到!请重新输入!"<<endl;
}
for(it=start;it!=end;it++)
*gl=NULL;//释放*gl
*wj=NULL;
return;
}
free std;
问题点数:100、回复次数:7Top
1 楼shucun(树村)回复于 2003-12-03 14:50:43 得分 0
我的邮箱是shucun@126.comTop
2 楼fuxf(布衣)回复于 2003-12-03 15:26:07 得分 0
呆会来Top
3 楼wangweixing2000(星(inspiration(灵感)))回复于 2003-12-03 15:32:09 得分 0
GZTop
4 楼shucun(树村)回复于 2003-12-03 17:01:14 得分 0
虔诚等待各位朋友的到来!感谢大家的关注
请不吝赐教Top
5 楼shucun(树村)回复于 2003-12-03 22:08:39 得分 0
各位大哥,大姐,我在这里等里一整天了。还没有人来!给点面子,帮我看看吧!Top
6 楼0sch(!)回复于 2003-12-12 09:29:13 得分 100
我还是把程序贴出来
首先,建立一个库文件,我们将其取名为id.lib,其内容格式如下:
41011111111111
河南公司
0371-8888888
某某某1
41011111111112
上海公司
0371-8888889
某某某3
41011111111113
深圳公司
0371-8888800
某某某3
.
.
.
你也可以根据具体需要,在改编程序时改变库文件格式。
然后,用VC++6.0新建一个基于对话框模板的工程,在其中加入一个EditBox控件,点击右键选取属性。选中它的多行、只读、竖向滚动条选项。
然后增加一个Static Text控件,将内容改为:请输入纳税人ID。
然后再在其后增加一个EditBox控件。
然后在对话框上点击右键,选择ClassWizard,在其中为两个编辑控件分别映射一个CString类型的变量,取名为:m_out,m_id
然后选中第一页,在左边框子中选中IDC_EDIT2控件ID,然后在右边框选中change消息,点击增加函数按钮,然后点击edit按钮,在这个函数中增加代码:
UpdateData();
if(m_id.GetLength()<14)
{
return;
}
else
{
ifstream infile("id.lib");
char * buff=new char[256];
while(!infile.eof())
{
infile.getline(buff,255,'\n');
if(CString(buff)!=m_id)
continue;
else
break;
}
if(infile.eof())
{
AfxMessageBox(_T("没有这个ID,请检查是否输错"),MB_ICONSTOP);
infile.close();
return;
}
else
{
m_out+=_T("纳税人识别号:")+CString(buff);
for(int i=0;i<4;i++)
{
if(!infile.eof())
infile.getline(buff,255,'\n');
if(infile.eof())
{
AfxMessageBox(_T("库文件错误"),MB_ICONSTOP);
infile.close();
return;
}
CString str;
switch(i)
{
case 0:
m_out+=_T("\r\n纳税人名称:");
m_out+=CString(buff);
break;
case 1:
SYSTEMTIME time;
::GetSystemTime(&time);
str.Format("\r\n纳税时间:%d-%d-%d",
time.wYear,
time.wMonth,
time.wDay);
m_out+=str;
m_out+=_T("\r\n电话号码:");
m_out+=CString(buff);
break;
case 2:
m_out+=_T("\r\n法定代表人:");
m_out+=CString(buff);
break;
default:
m_out+=_T("\r\n\r\n");
}
}
}
infile.close();
}
UpdateData(FALSE);
m_ctlOut.SetSel(m_out.GetLength()-1,m_out.GetLength());
然后,再映射WM_CLOSE消息,增加函数,更改如下:
void CMyDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
ofstream outFile("record.txt");
outFile<<m_out;
outFile.close();
CDialog::OnClose();
}
在本程序开始部位,加入
#include "fstream.h"
编译,运行,搞定。
Top
7 楼0sch(!)回复于 2003-12-12 09:32:27 得分 0
你的邮箱是shucun@126.com 吧,
我将程序发向你的邮箱.
希望你结合我的程序和给你的这些指导,好好研究研究程序的结构,主要是VC自己生成的东西,程序是如何执行的,是如何响应消息的,再看一看书.
你是聪明人,应该就此可以入门了.
再见!Top




