使用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=