linux/windows 读写ini配置文件

DWORD MyClass::GetPrivateProfileString(
          LPCTSTR lpAppName,        // section name
          LPCTSTR lpKeyName,        // key name
          LPCTSTR lpDefault,        // default string
          LPTSTR lpReturnedString,  // destination buffer
          DWORD nSize,              // size of destination buffer
          LPCTSTR lpFileName        // initialization file name
           )
{
    int iRet = -1;
    //WINDOWS编译环境
#ifdef WIN32
    return ::GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName);
//linux编译环境
#elif defined LINUX
    short bfindsection = false;
    char szsection[100] = {0};
    char szentry[100] = {0};
    char sztmp[MAXLINELENGTH] = {0};
    char sztmpb[MAXLINELENGTH] = {0};
    char szresult[MAXLINELENGTH] = {0};
    memset(lpReturnedString, 0, strlen(lpReturnedString));
    //去右空格
    //TrimRight(lpAppName);
    //TrimRight(lpKeyName);
    //TrimRight(lpFileName);
    if(false == CAdapter::PathFileExists(lpFileName))
    {
        strcpy(lpReturnedString,lpDefault);
        return strlen(lpDefault);
    }

    sprintf(szsection , "[%s]" , lpAppName);
    sprintf(szentry , "%s=" , lpKeyName);

    FILE* stream;
    stream = fopen( lpFileName, "r" );
    if( stream != NULL )
    {
        //找到pcsection
        while(!feof(stream) && !bfindsection)
        {
            memset(sztmp,0x00,MAXLINELENGTH);
            fscanf(stream , "%s" , sztmp) ;
            bfindsection = !strcmp(sztmp , szsection) ;
        }

        memset(sztmp,0x00,MAXLINELENGTH);
        while (!feof(stream) && bfindsection && sztmp[0] != '[')
        {
            memset(sztmp,0x00,sizeof(sztmp));
            ReadString(sztmp , MAXLINELENGTH, stream);
            //RemoveChar(sztmp,' ');
            //printf("%s\n", sztmp);
            RemoveSpace(sztmp);
            //printf("%s\n\n", sztmp);
            strncpy(sztmpb, sztmp, sizeof(sztmpb));
            if (strncmp(sztmp,szentry,strlen(szentry)) == 0)
            {
                strncpy(szresult , &sztmpb[strlen(szentry)], sizeof(szresult)-1);
                //RemoveChar(szresult,'=');
                RemoveChar(szresult,'\n');
                RemoveChar(szresult,'\r');
                if(nSize < strlen(szresult) && lpReturnedString != NULL)
                {
                    strncpy(lpReturnedString, szresult, nSize-1);
                    lpReturnedString[nSize-1] = '\0';
                    iRet = nSize-1;
                }
                else if(lpReturnedString != NULL)
                {
                    strncpy(lpReturnedString, szresult, strlen(szresult));
                    iRet = strlen(lpReturnedString);
                }

                break;
            }
        }
    }
    //取默认值的情况:
    //1.打开文件失败
    //2.AppName未找到
    //3.KeyName未找到
    if(((NULL == stream) || !bfindsection || (sztmp[0] == '[') || (!feof(stream) && iRet==-1)) && (lpDefault != NULL))
    {
        strncpy(lpReturnedString, lpDefault, nSize);
        iRet = strlen(lpDefault);
    }
    if(stream != NULL)
    {
        fclose( stream );
        stream = NULL;
    }
#endif
    return iRet;
}
//按行读取文件,去除行中的'\r'和'\n'
char*  MyClass::ReadFileLine(char* szConn, FILE* stream)
{
char* pc = szConn;
char conn[2] = {0};
while (fread(conn, 1, 1, stream) > 0)
{
if (conn[0] == '\r')
continue;
if (conn[0] == '\n')
break;
memcpy(pc, conn, 1);
++pc;
}
*pc = '\0';
return szConn;
}

bool MyClass::WritePrivateProfileString( LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName )
{
#ifdef WIN32
return ::WritePrivateProfileString(lpAppName, lpKeyName, lpString, lpFileName);
#elif defined LINUX
char szsection[100] = {0};
char szentry[100] = {0};
char sztmp[MAXLINELENGTH] = {0};
sprintf(szsection, "[%s]", lpAppName);
sprintf(szentry , "%s=" , lpKeyName);
//read file conn
if (!PathFileExists(lpFileName))
{
//file not exist
FILE* pfile = fopen(lpFileName, "w");
if (!pfile)
{
return false;
}
sprintf(sztmp, "%s\n%s%s\n", szsection, szentry, lpString);
fwrite(sztmp, sizeof(char), strlen(sztmp), pfile);
fclose(pfile);
return true;
}
std::string strConn = "";
std::string strRow = "";
size_t nAppPos = std::string::npos;
size_t nKeyPos = 0;
bool bfindapp = true;
bool bfindkey = false;
FILE* pfile = NULL;
pfile = fopen(lpFileName, "r");
while (!feof(pfile))
{
memset(sztmp, 0, sizeof(sztmp));
fscanf(pfile, "%s", sztmp); //行读取 确保每行无空格以\n结尾,否则需自定义函数
strRow = sztmp;
if (nAppPos == std::string::npos && (nAppPos = strRow.find(szsection)) == 0)
{
strConn += szsection;
strConn += "\n";
nAppPos = strConn.length();
nKeyPos = std::string::npos;
}
else if (nKeyPos == std::string::npos && (nKeyPos = strRow.find(szentry)) == 0)
{
strConn += szentry;
strConn += lpString;
strConn += "\n";
}
else
{
strConn += strRow;
strConn += "\n";
}
}
if (nAppPos == std::string::npos && nKeyPos == 0)
{
memset(sztmp, 0, sizeof(sztmp));
sprintf(sztmp, "%s\n%s%s\n", szsection, szentry, lpString);
strConn += sztmp;
}
else if (nAppPos != std::string::npos && nKeyPos == std::string::npos)
{
std::string strBack = strConn.substr(nAppPos);
strConn = strConn.substr(0, nAppPos);
strConn += szentry;
strConn += lpString;
strConn += "\n" + strBack;
}
fclose(pfile);
pfile = fopen(lpFileName, "w");
fwrite(strConn.c_str(), sizeof(char), strConn.length(), pfile);
fclose(pfile);
return true;
#endif
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,可以使用各种方法来读写INI配置文件。 首先,INI配置文件通常采用文本格式,可以使用文本编辑器(如vi、nano等)直接编辑配置文件。你可以通过打开终端,进入配置文件所在的目录,使用文本编辑器打开配置文件,进行修改和保存。 其次,Linux提供了一些命令行工具来处理INI配置文件,如sed和awk。sed是流编辑器,可以用来处理和修改文本文件。通过使用sed命令,你可以根据需要修改INI配置文件中的特定键和值。类似地,awk也可用于处理INI配置文件,它是一种强大的文本处理工具,具有高级的文本处理功能。 此外,你还可以通过编写脚本来读写INI配置文件,如使用bash脚本、Python脚本等。通过读取配置文件,并解析其中的键值对,你可以在脚本中直接使用这些配置参数。在脚本中,你可以使用文本处理函数、正则表达式等工具来解析和修改INI配置文件。 最后,还有一些特定的库和工具可以用于读写INI配置文件,如Python中的configparser模块。这些库和工具提供了更高级的功能,可以方便地读取和修改INI配置文件,同时还可以进行验证、错误处理等操作。 总之,Linux提供了多种方法用于读写INI配置文件,从简单的文本编辑器到强大的命令行工具和编程语言,你可以根据自己的需求选择适合的工具来处理INI配置文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值