急用!Linux环境下,使用C语言读写ini文件。

FigoZhu 2006-05-19 12:56:07
急用,最好有完整的代码。
谢谢!
...全文
1982 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
极速小王子 2006-10-19
  • 打赏
  • 举报
回复
有模块(XINI),下载到:
http://mail.163.com
USERNAME: lihu.release
PASSWORD: 123456

MY QQ: 11983222,加入发xini
Dong 2006-06-05
  • 打赏
  • 举报
回复
RemoveStrChr(str, str, ' ');
RemoveStrChr(str, str, '\t');
RemoveStrChr(str, str, '\n');
---------------------------------
这里用到了这个函数的代码是这样的

int RemoveStrChr(char* szSource, char* szDest, char Chr)
{
if(szSource < 0)
return FAIL;
while(*szSource != 0)
{
if(*szSource == Chr)
{
++szSource;
continue;
}
*szDest++ = *szSource++;
}
*szDest = 0;
return SUCCESS;
}

记得先分配好空间
zez 2006-06-05
  • 打赏
  • 举报
回复
简单的,自己 fopen,seek,gets,read 等等..
不嫌麻烦的话,去 sf下个开源的ini解析包
Dong 2006-06-05
  • 打赏
  • 举报
回复
上面的程序,最初是在一个大公司工作的时候写的。
Dong 2006-06-05
  • 打赏
  • 举报
回复
int ReadIniFileColumn(char* szFileName, char* szColumnName, char* szColumnValue, char* szDefaultValue);
------------------------以下是定义,相干宏改动一下,看看就知道
int ReadIniFileColumn(char* szFileName, char* szColumnName, char* szColumnValue, char* szDefaultValue)
{
FILE* IniFile = NULL;
struct stat buf;
if(stat(szFileName, &buf))
return ERR_FILE_NOT_EXIST;
IniFile = fopen(szFileName, "r");
if(!IniFile)
return ERR_FILE_ACCESS;
char str[256];
char column[256];
char value[256];
memset(str, 0, 256);
while(fgets(str, 256, IniFile) != NULL)
{
if(str[0] == '#')
continue;
if(!strstr(str, szColumnName))
continue;
RemoveStrChr(str, str, ' ');
RemoveStrChr(str, str, '\t');
RemoveStrChr(str, str, '\n');
char* tmp = str;
while(*tmp != 0 && *tmp != '#')
++tmp;
tmp = 0;
if((tmp = strchr(str, '=')) == NULL)
continue;
memset(column, 0, 256);
memset(value, 0, 256);
strncpy(column, str, tmp - str);
column[tmp - str] = 0;
sprintf(value, "%s", ++tmp);
//sscanf(str,"%s=%s",column,value);
if(!strcmp(szColumnName, column))
{
sprintf(szColumnValue, "%s", value);
fclose(IniFile);
return SUCCESS;
}
memset(str, 0, 256);
}
fclose(IniFile);
sprintf(szColumnValue, "%s", szDefaultValue);
return SUCCESS;
}
-------------------------------------------
以下是要读取的ini文件

#####LOG FILE PATH (direction!!)#######
LOGFILE=/home/oracle/wangds/atm_server/log
#####LISTEN PORT#######################
PORT=8100
##########FTPPath#####################
FTPPATH=/home/oracle/ftpdir
##还可以是这样的
FILE=/home/iniFile#########这也可以,反正'#'表示注解
FigoZhu 2006-06-05
  • 打赏
  • 举报
回复
To chenhu_doc,

兄弟,只写了读啊。
写怎么办啊?
code_tin 2006-05-19
  • 打赏
  • 举报
回复
ugg阿。人家是要在linux环境下呢。。。
逸学堂 2006-05-19
  • 打赏
  • 举报
回复
GetPrivateProfileInt和GetPrivateProfileString函数。
chenhu_doc 2006-05-19
  • 打赏
  • 举报
回复
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // points to section name
LPCTSTR lpKeyName, // points to key name
LPCTSTR lpDefault, // points to default string
LPCSTR lpReturnedString, // points to destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // points to initialization filename
)
{
enum BOOL { FALSE,TRUE };
DWORD ret = 0;
FILE* file = NULL;
try
{
ret = strlen(lpDefault);
if (ret < nSize)
strcpy(lpReturnedString,lpDefault);
else
{
int i;
for (i = 0;i < nSize - 1;i++)
lpReturnedString[i] = lpDefault[i];
lpReturnedString[i] = '\0';
ret = nSize - 1;
}

file = fopen(lpFileName,"r");
if (file == NULL)
return ret;

if (lpAppName == "")
{
char buf[256];
int size = 256;
char* _buf = buf;
char* lpret = lpReturnedString;
DWORD count = 0;

while(fgets(_buf,size,file) != NULL && (count < nSize - 2))
{
if (_buf[0] != '[') continue;
for ( int i = 1;
count < nSize - 2 &&
_buf[i] != ']' &&
_buf[i] != '\r' &&
_buf[i] != '\n';
i++)
{
*lpret = _buf[i];
lpret++;
count++;
}
*lpret = '\0';
lpret++;
count++;
}
*lpret = '\0';
if (count > 0) count--;
fclose(file);
file = NULL;
return ret = count;
}// end of lpAppName == ""

if (lpKeyName == "")
{
char srcbuf[256];
char desbuf[256];
int size = 256;
char* _srcbuf = srcbuf;
char* _desbuf = desbuf;
char target = 'S'; //'S' find section name,'K' find key name
char* lpret = lpReturnedString;
DWORD count = 0;
while(fgets(_srcbuf,size,file) != NULL && (count < nSize - 2))
{
BOOL flag = TRUE;
if (target == 'S')
{
if (_srcbuf[0] != '[') continue;
strcpy(_desbuf,lpAppName);
int len = strlen(_desbuf);
int i;
for (i = 0;i < len;i++)
{
if (_desbuf[i] != _srcbuf[i + 1])
{
flag = FALSE;
break;
}
}
if (flag == FALSE) continue;
if (_srcbuf[i + 1] != ']') continue;
target = 'K';
}
else
{
if (_srcbuf[0] == '[') break;
for ( int i = 0;
count < nSize - 2 &&
_srcbuf[i] != ' ' &&
_srcbuf[i] != '=' &&
_srcbuf[i] != '\r' &&
_srcbuf[i] != '\n';
i++)
{
*lpret = _srcbuf[i];
lpret++;
count++;

}
*lpret = '\0';
lpret++;
count++;
}// end of if
}// end of while
*lpret = '\0';
if (count > 0) count--;
fclose(file);
file = NULL;
return ret = count;

}// end of lpKeyName == ""

char srcbuf[256];
char desbuf[256];
int size = 256;
char* _srcbuf = srcbuf;
char* _desbuf = desbuf;
char target = 'S'; //'S' find section name,'K' find key name
while(fgets(_srcbuf,size,file) != NULL)
{
BOOL flag = TRUE;
if (target == 'S')
{
if (_srcbuf[0] != '[') continue;
strcpy(_desbuf,lpAppName);
int len = strlen(_desbuf);
int i;
for (i = 0;i < len;i++)
{
if (_desbuf[i] != _srcbuf[i + 1])
{
flag = FALSE;
break;
}
}
if (flag == FALSE) continue;
if (_srcbuf[i + 1] != ']') continue;
target = 'K';
}
else
{
if (_srcbuf[0] == '[') break;
strcpy(_desbuf,lpKeyName);
int len = strlen(_desbuf);
int i;
for (i = 0;i < len;i++)
{
if (_desbuf[i] != _srcbuf[i])
{
flag = FALSE;
break;
}
}
if (flag == FALSE) continue;

BOOL _flag = FALSE;
while (_srcbuf[i] != '\0')
{
if (_srcbuf[i] == ' ')
{
i++;
continue;
}
if (_srcbuf[i] == '=')
{
_flag = TRUE;
i++;
continue;
}
if (_flag == FALSE) break;
char* lpresult = &_srcbuf[i];
char* lpret = lpReturnedString;
int count = 0;
//过滤换车和换行符
while ( *lpresult != '\r' &&
*lpresult != '\n' &&
*lpresult != '\0'
)
{
*lpret = *lpresult;
lpret++;
lpresult++;
count++;
}
*lpret = '\0';
fclose(file);
file = NULL;
return ret = count;
}// end of while
}// end of if
}// end of while
fclose(file);
file = NULL;
return ret;

}//end of try
catch(...)
{
if (file != NULL)
{
fclose(file);
file = NULL;
}
ret = strlen(lpDefault);
if (ret < nSize)
strcpy(lpReturnedString,lpDefault);
else
{
int i;
for (i = 0;i < nSize - 1;i++)
lpReturnedString[i] = lpDefault[i];
lpReturnedString[i] = '\0';
ret = nSize - 1;
}
return ret;
}

}//end of GetPrivateProfileString
#endif
chenhu_doc 2006-05-19
  • 打赏
  • 举报
回复
在Linux下使用的与window下的GetPrivateProfileInt和GetPrivateProfileString相同的函数,free software :-)

#ifndef VC
#ifndef _BCB
typedef unsigned int UINT;
typedef int INT;
typedef const char* LPCTSTR;
typedef char* LPCSTR;
typedef unsigned long DWORD;
#endif

char chrupr(const char chr) //char to upper
{
char ret = chr;
if (ret >= 'a' && ret <= 'z') ret -= 32;
return ret;
}

UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // address of section name
LPCTSTR lpKeyName, // address of key name
INT nDefault, // return value if key name is not found
LPCTSTR lpFileName // address of initialization filename
)
{
enum BOOL { FALSE,TRUE };
UINT ret = nDefault;
FILE* file = NULL;
try
{
file = fopen(lpFileName,"r");
if (file == NULL)
return ret;
char srcbuf[256];
char desbuf[256];
int size = 256;
char* _srcbuf = srcbuf;
char* _desbuf = desbuf;
char target = 'S'; //'S' find section name,'K' find key name
while(fgets(_srcbuf,size,file) != NULL)
{
BOOL flag = TRUE;
if (target == 'S')
{
if (_srcbuf[0] != '[') continue;
strcpy(_desbuf,lpAppName);
int len = strlen(_desbuf);
int i;
for (i = 0;i < len;i++)
{
if (_desbuf[i] != _srcbuf[i + 1])
{
flag = FALSE;
break;
}
}
if (flag == FALSE) continue;
if (_srcbuf[i + 1] != ']') continue;
target = 'K';
}
else
{
if (_srcbuf[0] == '[') break;
strcpy(_desbuf,lpKeyName);
int len = strlen(_desbuf);
int i;
for (i = 0;i < len;i++)
{
if (_desbuf[i] != _srcbuf[i])
{
flag = FALSE;
break;
}
}
if (flag == FALSE) continue;

BOOL _flag = FALSE;
while (_srcbuf[i] != '\0')
{
if (_srcbuf[i] == ' ')
{
i++;
continue;
}
if (_srcbuf[i] == '=')
{
_flag = TRUE;
i++;
continue;
}
if (_flag == FALSE) break;
char* lpresult = &_srcbuf[i];
if (lpresult == "0")
{
fclose(file);
file = NULL;
return 0;
}
UINT value = strtoul(lpresult,NULL,0);
if (value != 0) ret = value;
fclose(file);
file = NULL;
return ret;
}
}//end of if
}// end of while
fclose(file);
file = NULL;
return ret;
}// end of try
catch (...)
{
if (file != NULL)
{
fclose(file);
file = NULL;
}
return ret;
}
}//end of GetPrivateProfileInt
sewenew 2006-05-19
  • 打赏
  • 举报
回复
从我见过的ini文件来看,都是文本方式的(不知道是不是我见的太少了,不要嘲笑阿,呵呵),如果你的ini文件时文本方式的,那么直接用和文件相关的函数读写,移动指针不就可以了吗?

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧