举个例子,INI文件的内容如下:[10.110.114.22]
COUNT=1
1=FFFFFF11
[10.110.114.27]
COUNT=2
1=FFFFFF21
2=FFFF01FF
[192.168.0.81]
COUNT=1
1=001FF001
[192.168.0.82]
COUNT=3
1=002FF001
2=F00FFFFF
3=FFFFF456这个INI文件里,实际上存储的是一张IP与ID的对应关系表,IP与ID为一对多的关系映射。一个IP对应的ID数目不确定,个数由COUNT给出。我现在需要实现的是,给出一个ID号,要能从INI文件中,查找出其ID对应的IP是多少?。。 不考虑ID出现相同的情况。
比如:我输入“F00FFFFF”,要能得出其IP为192.168.0.82。小弟很菜!还请各位大哥、大姐多多照顾 :)
谢谢先

解决方案 »

  1.   

    有一个CIniFile类,功能挺全的
    http://www.codeproject.com/cpp/cinifile.asp
      

  2.   

    最好的方式是初始化即读取该ini文件中数据,把成对的数据存入一张map表中方便查询
      

  3.   

    先读入CString,然后Find("=F00FFFFF"), 然后ReverseFind("]"),然后ReverseFind("["),然后Mid;应该可行,但不好
    等待更好的方法
      

  4.   

    #include <string.h>
    #include <stdlib.h>
    #include  <stdio.h>#define MY_STR_LEN 256char* ReadLine( FILE* fp, char* sBuf, int nCount);
    int FindChar(const char* str, char c);
    char* FindIpById(FILE* fp, const char* str);void main()
    {
    FILE* fp = fopen("I:\\id.txt","rt");
    if(!fp)
    {
    printf("%s","Open file failed!\n");
    return;
    } char str[245] = {0};
    while(strcmp(str, "quit"))
    {
    printf("%s","Enter a ID:");
    scanf("%s", str);
    if(!strcmp(str,"quit"))
    break;
    printf("%s\n",FindIpById(fp, str));
    fseek(fp,0,SEEK_SET);
    } fclose(fp);
    }char* ReadLine( FILE* fp, char* sBuf, int nCount)
    {
    char c;
    for(int i=0; !feof(fp) && i<nCount-1; i++)
    {
    fread(&c ,1 ,1 ,fp);
    if(c == 10)
    {
    sBuf[i] = 0;
    return sBuf;
    }
    else
    {
    sBuf[i] = c;
    }
    }
    sBuf[nCount-1] = 0;
    return sBuf;
    }int FindChar(const char* str, char c)
    {
    for(int i=0; str[i]; i++)
    {
    if( c == str[i])
    return i;
    }
    return -1;
    }char* FindIpById(FILE* fp, const char* str)
    {
    char sIP[MY_STR_LEN] = {0};
    char sID[MY_STR_LEN] = {0};
    int i; while( !feof(fp))
    {
    ReadLine(fp, sIP, MY_STR_LEN); ReadLine(fp, sID, MY_STR_LEN); i = atoi(&sID[FindChar(sID, '=' ) + 1]); for(; i > 0; i--)
    {
    ReadLine(fp, sID, MY_STR_LEN);
    if(! strncmp(&sID[FindChar(sID, '=') + 1], str, 8))
    return sIP;
    }
    }
    return NULL;
    }
    这个程序完全是根据你的这个文件的结构写的.所以一旦文件格式改变,这个程序也就废了.
      

  5.   

    http://topic.csdn.net/t/20041129/15/3598484.html 
    http://ruguo20.blogchina.com/ 这里有介绍那个几个API的!~
    http://xufiles.bokee.com/2942626.html
    遍历一遍INI就可以了!~
      

  6.   

    感谢特别来宾,hacker931(紫荆) 和 kaixuan1901(凯旋),我会加分的!呵呵。。我觉得这个程序用WINDOWS提供的 INI API 来做,可能会要好些,因为我的 INI 文件本来就是标准的INI 格式的。GetPrivateProfileInt、GetPrivateProfileString、GetPrivateProfileSectionNames、GetPrivateProfileSection、WritePrivateProfileString 等等,这里有没有朋友对这些API比较熟悉,使用过的?能不能给个实现的源代码?谢了。
      

  7.   

    CString CCeshiDlg::GetIP(CString id,CString filename)  //filename为ini文件的地址全称
    {
    CString str_id,buf[10];
    char bf[100];
    int i=0,j,k,count;
    GetPrivateProfileSectionNames(bf,2000,filename);
    buf[i++]=bf;
    for(j=0;j<100;j++)
    {
    if(bf[j]=='\0')
    {
    if(bf[j]==bf[j+1]) break;
    else buf[i++]=&bf[j+1];
    }
    }
    for(j=0;j<i;j++)
    {
    count=GetPrivateProfileInt(buf[j],"COUNT",1,filename);
    for(k=1;k<=count;k++)
    {
    char t[4];
    itoa(k,t,10);
    GetPrivateProfileString(buf[j],t,"1",str_id.GetBufferSetLength(100),100,filename);
    if(id==str_id)
    {
    return buf[j];
    }
    }
    }
    return "";
    }
      

  8.   

    #define MAX_S 1000
    #define MAX_T 15000
    CString GetIP(CString id,CString filename)  //filename为ini文件的地址全称
    {
    CString str_id,buf[MAX_S];
    char bf[MAX_T];
    int i=0,j,k,count;
    GetPrivateProfileSectionNames(bf,MAX_T,filename);
    buf[i++]=bf;
    for(j=0;j<MAX_T;j++)
    {
    if(bf[j]=='\0')
    {
    if(bf[j]==bf[j+1]) break;
    else buf[i++]=&bf[j+1];
    }
    }
    for(j=0;j<i;j++)
    {
    count=GetPrivateProfileInt(buf[j],"COUNT",1,filename);
    for(k=1;k<=count;k++)
    {
    char t[4];
    itoa(k,t,10);
    GetPrivateProfileString(buf[j],t,"1",str_id.GetBufferSetLength(20),20,filename);
    if(id==str_id)
    {
    return buf[j];
    }
    }
    }
    return "";
    }
      

  9.   

    谢谢 jsj0415009(俊俏小疯侠) 了!我想能不能把你程序里关于CString的定义,改成 char* ,可以吗?
    因为我现在是在写DLL,我想导出函数应该不能用CString类型做参数吧?是不是导出函数的参数得用最基本的数据类型?可能调用此DLL的应用程序有可能是用VC 或 VB 或 Delphi写的。。
      

  10.   

    可以改成char*,但后面要用strcpy函数了
      

  11.   

    再次的谢谢 jsj0415009(俊俏小疯侠) 了!能帮我改改你的代码么?用char*,不用CString 。 我还不太明白char* 和 CString 这两者之间的区别呢?
    例如:
    CString str1;  char* str2=NULL;
    str1="A10B0CA5002FF001F1F2F3F4";
    怎么让 str2 也等于"A10B0CA5002FF001F1F2F3F4" ?  难道是 str2=str1;??不好意思!我太弱了 谢谢
      

  12.   

    #define MAX_S 1000
    #define MAX_T 15000
    char* GetIP(char* id,char* filename)
    {
    char idd[100],*buf[MAX_S],bf[MAX_T];
    int i=0,j,k,count;
    GetPrivateProfileSectionNames(bf,MAX_T,filename);
    buf[i++]=bf;
    for(j=0;j<MAX_T;j++)
    {
    if(bf[j]=='\0')
    {
    if(bf[j]==bf[j+1]) break;
    else buf[i++]=&bf[j+1];
    }
    }
    for(j=0;j<i;j++)
    {
    count=GetPrivateProfileInt(buf[j],"COUNT",1,filename);
    for(k=1;k<=count;k++)
    {
    char t[4];
    itoa(k,t,10);
    GetPrivateProfileString(buf[j],t,"1",idd,100,filename);
    if(strcmp(id,idd)==0)
    {
    return buf[j];
    }
    }
    }
    return "no ip correspond to the id!";
    }
      

  13.   

    谢谢!想再问个相关的问题,如果我现在是在写 MFC DLL ,要将这个函数导出,并且该DLL有可能是给VC,VB或是DELPHI等等来调用...那么该如何导出呢? __declspec(dllexport) char*  __stdcall GetIP(char* id,char* filename);
    __declspec(dllexport) CString   __stdcall GetIP(CString id,CString filename);是用前者,还是选择后者? 在DLL的导出函数的参数,是不是不能用 CString ?必须用基本数据类型char* 么?
      

  14.   

    我是楼主。想再问个相关的问题,如果我想实现DLL和上面调用DLL的应用程序之间的通信,该怎么做?DLL给应用程序发消息,用类似WINDOWS的消息机制,SendMessage(m_hWnd,WM_CLOSE,0,0);??
    SendMessage 函数可以吗?如果可以的话,那么它的调用参数,该如何给出呢?谢谢先!请达人来帮帮忙。
      

  15.   

    在mfc dll里面,用SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_CLOSE,0,0);可以实现关闭调用该dll的应用程序
      

  16.   

    jsj0415009(俊俏小疯侠) ,谢谢!呵呵我如果要做一个自定义的消息(不是WINDOWS的系统消息),该怎么写?通过该自定义的消息,可以从DLL里传递一个指针给调用的应用程序吗?如何实现呢?unsigned char buf[512]; (char*)buf ,传递这个指针,可以么?
      

  17.   

    我是楼主。顺便,再问个相关的问题,我现在是在写MFC DLL,DLL编译之后,通过了。用VC++ 6.0 自带的工具,Dependency Walker打开DLL,看里面生成的导出函数,发现了如下的问题:
    extern "C" __declspec(dllexport) int __stdcall fun(int x1,int x2,int x3);
    extern "C" __declspec(dllexport) BOOL __stdcall PlayAudio(CHAR *pData, DWORD nLen);
    extern "C" __declspec(dllexport) BOOL __stdcall PlayVideo(INT decoder, CHAR *pData, DWORD nLen, LPRECT lprect); 
    这是我DLL源代码里定义的导出函数,不过我发现用Dependency Walker打开DLL,看到的函数名变成了:
    _fun@12
    _PlayAudio@8
    _PlayVideo@16
    ??? 这是怎么回事? 怪不得我用 VC 写了个应用程序,GetProcAddress,取不到对应的函数呢。。
      

  18.   

    higter(),呵呵,老乡,结帖子的时候,会给你分的咯!。。想再问个问题,为什么我在DLL里创建SOCKET失败?可相同的代码放到应用程序,可以实现,没问题。// 1、创建命令套接字
       BOOL bSucc = m_sock_control.CreateSocket(Port_Control);
       if(!bSucc)
    {
               AfxMessageBox("创建网络套接字失败\n" , 
    MB_ICONERROR|MB_OK);
    return -1;
    }
       m_sock_control.SetRecvCallBack(listen_control_channel,this);
    class CNetwork  
    {
    public:
        CNetwork();
        virtual ~CNetwork();
        int InitNetworkA();
    public:
        CMySocket m_sock_video;
        CMySocket m_sock_audio;
        CMySocket m_sock_control;
    };哎!上面的问题,怎么就没高手过来,给我解释下呢
    期待中ing
      

  19.   

    class CMySocket : public CAsyncSocket CMySocket 类(包括*.h 和 *.lib的文件)是已经写好了的,使用该类可以通过创建 SOCKET 来实现 UDP 数据包的接收和发送。我用VC写应用程序时,已经验证过了,CMySocket 类没问题。但为什么把部分代码移植到 DLL 中,我想在 DLL 里也实现 UDP 通信,怎么就不行了呢?MFC DLL 编译都没问题,但我在调试 DLL 的时候,发现创建 SOCKET 的时候,失败。。为何呢? 是不是我创建的 MFC DLL 哪里没设置好?还是在 DLL 里,引用其他的类的时候,有些地方我写错了?
    我很菜的,请高手来解答下!
      

  20.   

    我是楼主。自己来顶一下~~~~~~~~~~~~~~~~~~~上面的问题,已经解决了。谢谢!想再问个相关的问题,哪位兄台能不能把关于在VC++中如何加入自定义消息,给段详细的代码说明?具体流程包括:在 DLL 中,首先如何定义消息?其次,如何加入消息响应函数及加入消息响应宏?应用程序端该如何写? 最后,自定义的消息怎么触发啊? 等等 的问题,能不能说得详细一点小弟很菜!谢了先。