使用ifstream.seekg犯的错误
使用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=
//----------遗漏备注---------------------
#
re: [C++] 使用ifstream.seekg犯的错误
少一个pchar.h
已经添加了 pchar.h 主要是几个字符串处理函数
本文介绍了在使用C++标准库中的ifstream类时,如何正确使用seekg成员函数进行文件指针定位,特别强调了将文件指针重定位到文件开头时正确的参数设置方式,并通过实例代码展示了如何读取INI配置文件。
3713

被折叠的 条评论
为什么被折叠?




public void closeIni(){
inFile.close();
printf("ini文件句柄释放!/n");
}