使用ifstream的时候,可以用seekg进行重定位,但有一个需要注意的地方。
如果想重定位到文件头,应该用:
mFile.seekg(0, ios_base::beg);
而不是
mFile.seekg(ios_base::beg);
我实验的结果是,后者会定位到文件头后面一个字符,也就是说,第一个字符被吃掉了。

我要记得,每一个指针在申明d时候就必须要初始化啊初始化,调试了1个工作日.

读日志文件的一个类

//pchar.hpp
 1  #include  < string .h >
 2 
 3  void  trimLeft( char   *  p_char){
 4     char  szBuff[ 1024 ];
 5    memset(szBuff,  0 sizeof (szBuff));
 6     char   * pBuff  =  p_char;
 7     while * pBuff  ==   '   ' ){
 8       ++  pBuff;
 9    }
10 
11    strncpy(szBuff, pBuff,  sizeof (szBuff)  - 1 );
12    strncpy(p_char, szBuff, strlen(szBuff));
13    p_char[strlen(szBuff)]  =   0x0 ;
14  }
15 
16 
17  void  trimRight( char   *  p_char){
18     for ( int  i  =  strlen(p_char)  -   1 ; i  >=   0 ; i --  ){
19       if * (p_char  +  i)  ==   '   ' ) {
20         * (p_char  +  i )  =   ' \0 ' ;
21      } else   break ;
22    }
23  }
24 
25  void  trim( char   *  p_char){
26    trimLeft(p_char);
27    trimRight(p_char);
28  }
29 
30 



 1  // IniFile.hpp
 2 
 3  #include  < unistd.h >
 4  #include  < stdio.h >
 5  #include  < stdlib.h >
 6  #include  < string >
 7  #include  < fstream >
 8 
 9  using   namespace  std;
10 
11  #ifndef INIFILE_HPP_
12  #define  INIFILE_HPP_
13 
14 
15  class  IniFile {
16 
17     public :
18      IniFile(){ m_bOpened =   false ;}
19 
20      IniFile( const   char   *  p_szFileName);
21       ~ IniFile();
22 
23     public :
24       void  setFileName( const   char   *  p_szFileName);
25       int  openIni();
26       int  getPchar ( const   char   * p_szSection,  const   char   * p_szKey,  char   * p_szDefaultValue);
27       int  getInt   ( const   char   * p_szSection,  const   char   * p_szKey,  int &  p_iDefaultValue);
28       int  getBool  ( const   char   * p_szSection,  const   char   * p_szKey,  int &  p_iDefaultValue);
29       int  getString( string  p_strSection,  string  p_strKey,  string &  p_strDefaultValue);
30 
31     protected :
32 
33 
34     private :
35      ifstream inFile;
36       char  m_szFileName[ 256 ];
37       char  m_szSection[ 32 ];
38       bool  m_bOpened;
39  };
40 
41  #endif   // INIFILE_HPP_
42 
43 


  1  // IniFile.cpp
  2 
  3  #include  " ../include/IniFile.hpp "
  4  #include  " ../include/pchar.hpp "
  5 
  6 
  7  IniFile::IniFile( const   char   *  p_szFileName){
  8    m_bOpened  =   false ;
  9    setFileName(p_szFileName);
 10  }
 11 
 12  IniFile:: ~ IniFile(){
 13    inFile.close();
 14    printf( " ini文件句柄释放!\n " );
 15  }
 16                           
 17  void  IniFile::setFileName( const   char   *  p_szFileName){
 18    memset( m_szFileName,  0 sizeof (m_szFileName) );
 19    strncpy( m_szFileName, p_szFileName,  sizeof (m_szFileName) - 1  );
 20  }
 21 
 22 
 23 
 24 
 25  int  IniFile::openIni(){
 26    inFile.open(m_szFileName, ios:: in );
 27     if  ( !  inFile.good()){
 28       return   - 1 ;
 29      m_bOpened =   false ;
 30    }
 31 
 32    m_bOpened =   true ;
 33     return   0 ;
 34  }
 35 
 36 
 37  int  IniFile::getPchar( const   char   * p_szSection,  const   char   * p_szKey,  char   * p_szDefaultValue){
 38     char  szBuff[ 1024 ];
 39     char  szKey[ 32 ] ;
 40     char  szDefaultValue[ 64 ] ;
 41     char  szCurrentSection[ 32 ];
 42     string  strLine;
 43     int  iLen  =   0 , bInSelfSection  =   0  ;
 44     char   *  pStrValue  =  NULL ;
 45                                         
 46    memset(m_szSection,  0 sizeof (m_szSection) ) ;
 47    strncpy(m_szSection, p_szSection,  sizeof (m_szSection) - 1 );
 48    
 49    memset(szKey,  0 sizeof (szKey));
 50    strncpy(szKey, p_szKey,  sizeof (szKey)  -   1 );
 51 
 52    memset(szDefaultValue,  0 sizeof (szDefaultValue));
 53    strncpy(szDefaultValue, p_szDefaultValue,  sizeof (szDefaultValue) - 1 );
 54 
 55    inFile.seekg( 0 , ios_base::beg);  // 将文件指针指向最开始d位置
 56     while ( ! inFile.eof()){
 57      getline(inFile, strLine);
 58 
 59      memset(szBuff,  0 sizeof (szBuff));
 60      snprintf(szBuff,  sizeof (szBuff) - 1 " %s " , strLine.c_str());
 61      trim(szBuff);
 62 
 63       if  ( (szBuff[ 0 ==   ' # ' ||  (strlen(szBuff)  <   3 ) ) {  // 取消对注释和无用数据的解析,
 64         continue ;
 65      }
 66 
 67      iLen  =  strlen(szBuff);
 68       if  (szBuff[iLen - 1 ==   0x0D // 将每一行配置的换行符后数据去掉
 69        szBuff[iLen - 1 =   0x0 ;
 70 
 71      iLen  =  strlen(szBuff);
 72       if  (szBuff[ 0 ==   ' [ '   &&  szBuff[iLen - 1 ==   ' ] ' ) {  // 判断是否为Section  [MOSERVER]
 73         if  (bInSelfSection)
 74          bInSelfSection  =   0 ;
 75 
 76        szBuff[iLen - 1 =   0x0 ;
 77        memset(szCurrentSection,  0 sizeof (szCurrentSection));
 78        strcpy(szCurrentSection, szBuff  +   1 );  // 取出section名
 79 
 80         if  (strcasecmp(m_szSection, szCurrentSection)  ==   0 ) {   // 如果是自己需要的section则做好标记
 81          bInSelfSection  =   1 ;
 82           continue ;
 83        }
 84      }
 85 
 86       if  ( ! bInSelfSection)   // 如果没有读到需要的section则继续找
 87         continue ;
 88 
 89       if  (pStrValue  ==  NULL){
 90        pStrValue  =  strchr(szBuff,  ' = ' );   // 查找'='的位置,没有找到则读下一条
 91      }
 92 
 93       if  (pStrValue  ==  NULL){
 94         continue ;
 95      }
 96       * pStrValue  =   0 // 将'='变为'0'来分割value和key
 97      pStrValue ++ ;
 98       if  ( * pStrValue  ==   0 ){ // 如果没有读到value则继续读下一条
 99         continue ;
100      }
101       if  (bInSelfSection) {
102         if (strcasecmp(szKey,szBuff) == 0 ){
103          strncpy(p_szDefaultValue, pStrValue,  64   -   1 );
104           return   0 ;
105        }
106      }
107      pStrValue  =  NULL;
108    }
109     return   - 1 ;
110  }
111 
112 
113  int  IniFile::getString( string  p_strSection,  string  p_strKey,  string &  p_strDefaultValue){
114    inFile.seekg( 0 , ios_base::beg);
115     char  szDefaultValue[ 64 ];
116    memset(szDefaultValue,  0 sizeof (szDefaultValue));
117    getPchar(p_strSection.c_str(), p_strKey.c_str(), szDefaultValue);
118    getPchar( " MOSERVER " " TIMEOUT " , szDefaultValue);
119     // printf("getchar: %s\n", szDefaultValue); //
120    p_strDefaultValue  =  szDefaultValue;
121     return   0 ;
122 
123 
124 


 1  // 测试程序
 2 
 3  #include  " ../include/IniFile.hpp "
 4 
 5  int  main(){
 6    printf( " 开始分析ini文件!\n " );
 7    IniFile ini;
 8     char  szPort[ 64 ];
 9    memset(szPort,  0 sizeof (szPort));
10 
11    ini.setFileName( " ../config/inifile.ini " );
12    ini.openIni();
13    ini.getPchar( " MOSERVER " " MAXCONNECTED " , szPort);
14    printf( " ini文件装载完成!\n " );
15 
16     string  timeout;
17    ini.getString( " MOSERVER " " TIMEOUT " , timeout);
18 
19    printf( " MAXCONNECTED:%s\n " , szPort);
20    printf( " TIMEOUT:%s\n " , timeout.c_str());
21 
22     return   0 ;
23  }



inifile.ini文件格式

#为注释,处理时自动去掉前后空格
#######################################################################
# the configuration for MOServer
# by Khan.Lau (Lau.Khan#gmail.com)
# 2006-04-12
#######################################################################

[MOSERVER]
LISTENPORT=8097
WHITEIP=192.168.1.122;127.0.0.1;
MAXCONNECTED=50
MAXCONSINGLEIP=5
TIMEOUT=60
DBHOST=127.0.0.1
DBNAME=smstest
DBPORT=9055
DBUID=postgres
DBPWD=