免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: mathfk
打印 上一主题 下一主题

[C] Linux的c语言编程时,是否有类似GetPrivateProfileString这样的函数。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-05-14 18:47 |只看该作者
LZ说的是读取配置文件的函数吧, 给个例子
BOOL GetPrivateProfileString2(
                        LPSTR aszSession,        
                        LPSTR aszKey,        
                        LPSTR aszDefault,        
                        char *  aszText,  
                        int   nSize,            
                        LPSTR aszFileName)
{
        FILE * fp;
        char szLineBuf[255] = "";       
        int  iInSession = 0;
        int  iHaveKey = 0;
        int  i ,j;
        int  iLen = 0;
        int  iBegin = 0;
        char szSession[40] = "";
        char szKey[40] = "";
        char szText[255] = "";
        strcpy(aszText,aszDefault);
       
        if ((fp = fopen(aszFileName,"r")) == NULL) return FALSE;
        while(fgets(szLineBuf,254,fp) != NULL)
        {
                /*分析输入的字符行*/
                iLen = strlen(szLineBuf);
                /*取第一个字符*/
                i = 0;
                for (;i < iLen && szLineBuf[i] == ' ' && szLineBuf[i] < '!' ;i ++ );
                if (i == iLen ) continue;
                if (szLineBuf[i] == '#') continue;
                if (szLineBuf[i] == '[')
                {
                        if (iInSession)               
                        {
                                fclose(fp);
                                return FALSE;
                        }
                        /*取Session*/
                        for (j = i + 1;(j < iLen && szLineBuf[j] != ']');j ++);
                        memcpy(szSession,szLineBuf + i + 1,j - i - 1);
                        szSession[j - i - 1] = '\0';
                        if (strcmp(szSession,aszSession) == 0) iInSession = 1;

                        continue;
                }
                else if (iInSession)       
                {
                        /*取Key*/
                        for (j = i ;(j < iLen && (szLineBuf[j] != ' ' && szLineBuf[j] != '=' ) && szLineBuf[j] >= '0');j ++);
                        memcpy(szKey,szLineBuf + i ,j - i );
                        szKey[j - i ] = '\0';
                        i = j;
                        if (strcmp(szKey,aszKey) == 0)       
                        {       
                                for (;i < iLen && ((unsigned char)szLineBuf[i] < '-' || szLineBuf[i] == '=') ;i ++ );

                                for (j = i ;j < iLen && (szLineBuf[j] != '#') ;j ++);
                                if (j <=i)
                                {
                                        strcpy(aszText,"");
                                }
                                else
                                {
                                        memcpy(szText,szLineBuf + i ,j - i - 1);
                                        rtrim(szText,0);
                                        szText[j - i - 1] = '\0';
                                        strcpy(aszText,szText);
                                }
                                iHaveKey = 1;
                                break;
                        }
                }
                else
                {
                        continue;
                }
        }
        fclose(fp);
        rtrim(aszText,0);
        if (iHaveKey)                return TRUE;
        else                                return FALSE;
}
BOOL WritePrivateProfileString2(
                        LPCTSTR lpAppName,
                        LPCTSTR lpKeyName,
                        LPCTSTR lpString,       
                        LPCTSTR lpFileName)
{
        char *token, *pLineToken;
        FILE *stream;
        char szBuffer[1024];
        char szAppSeps[]="[";
        char szKeySeps[]="=";
        DWORD nLen;
        char *pBuf, *pFileBuf;
        char *pSectionPos, *pKeyPos;
        unsigned long ulFileLen,i,k;

        BOOL bSectionFound = FALSE;
        BOOL bKeyFound = FALSE;
   
        if((stream = fopen( lpFileName, "r+b" )) == NULL )
        {
                return FALSE;
        }

    pBuf = szBuffer;

        fseek(stream, 0, SEEK_END);
        ulFileLen = ftell(stream);
               
        pFileBuf = (char*)malloc(ulFileLen);
        fseek(stream, 0, SEEK_SET);
        fread(pFileBuf, ulFileLen, 1, stream);
        fclose(stream);

        pLineToken = pFileBuf;
        while(pLineToken)
        {
                if(!bSectionFound)
                {
                        pSectionPos = pLineToken;
                }
                else
                {
                        pKeyPos = pLineToken;
                }

                pLineToken = strtok(pLineToken, "\n");

                if(!pLineToken) break;
                strcpy(pBuf, pLineToken);

                pLineToken+=strlen(pLineToken)+1;

                LTruncate(pBuf, " \t");       
               
                token = strstr(szBuffer, "//");
                if(token) token[0] = 0;

                if(pBuf = strchr(szBuffer, '\\'))
                {
                        if(pBuf[1]!='x' && pBuf[1]!='X')
                                continue;
                }
                pBuf = szBuffer;
                 
                if(strlen(szBuffer)==0) continue;
               
                if(!bSectionFound)
                {
                        token = strtok(szBuffer, szAppSeps);
               
                        if(token == szBuffer)
                                continue;

                        LTruncate(token, " \t");
                        RTruncate(token, " ]\t\r\n");
                        if(strcompi(token, lpAppName))
                                continue;  
                        else
                                bSectionFound = TRUE;
                }
                else
                {
                        nLen = strlen(szBuffer);
                        token = strtok(szBuffer, szKeySeps);
                        if(strlen(token) == nLen)
                        {   /* 判断是否离开指定的Section */
                                token = strtok(szBuffer, szAppSeps);
                                if(token != szBuffer)
                                        break;       
                                else
                                        continue;
                        }
                       
                        LTruncate(szBuffer, " \t");
                        RTruncate(szBuffer, " \t");
                               
                        if(strcompi(szBuffer, lpKeyName))
                        {
                                continue;
                        }
                        else
                        {   /* 找到 */
                                bKeyFound = TRUE;
                                break;
                        }
                }
        }
       
        if((stream = fopen( lpFileName, "wb" )) == NULL )
        {
                free(pFileBuf);
                return FALSE;
        }
       
        if(!bSectionFound && !bKeyFound)
        {
                for(i=0;i<ulFileLen;i++)
                {
                        if(pFileBuf[i]==0) pFileBuf[i]='\n';
                }
                fwrite(pFileBuf, i, 1, stream);
               
                fseek(stream, 0, SEEK_END);
                sprintf(szBuffer, "[%s]\n", lpAppName);
                fwrite(szBuffer, strlen(szBuffer), 1, stream);
                sprintf(szBuffer, "%s=%s\n", lpKeyName, lpString);
                fwrite(szBuffer, strlen(szBuffer), 1, stream);
        }
        else if(bSectionFound && bKeyFound)
        {
                for(i=0;pFileBuf+i<pKeyPos;i++)
                {
                        if(pFileBuf[i]==0) pFileBuf[i]='\n';
                }
                fwrite(pFileBuf, i, 1, stream);
                               
                sprintf(szBuffer, "%s=%s\n", lpKeyName, lpString);
                fwrite(szBuffer, strlen(szBuffer), 1, stream);
               
                k=0;
                for(i+=(strlen(pKeyPos)+1);i<ulFileLen;i++)
                {
                        if(pFileBuf[i]==0) pFileBuf[i]='\n';
                        k++;
                }
                fwrite(pKeyPos+strlen(pKeyPos)+1, k, 1, stream);
               
        }
        else if(bSectionFound && !bKeyFound)
        {
                for(i=0;pFileBuf+i<pKeyPos;i++)
                {
                        if(pFileBuf[i]==0) pFileBuf[i]='\n';
                }
                fwrite(pFileBuf, i, 1, stream);
               
                sprintf(szBuffer, "%s=%s\n", lpKeyName, lpString);
                fwrite(szBuffer, strlen(szBuffer), 1, stream);
               
                k=0;
                for(;i<ulFileLen;i++,k++)
                {
                        if(pFileBuf[i]==0) pFileBuf[i]='\n';
                }
                fwrite(pKeyPos, k, 1, stream);
        }

    fclose(stream);
        free(pFileBuf);
        return TRUE;
}

论坛徽章:
0
12 [报告]
发表于 2006-05-15 09:45 |只看该作者
原帖由 aero 于 2006-5-14 13:33 发表


风格问题没必要互相攻击。

风格统一不过是一个group的规定。比如一个公司的代码用一个风格的确是有好处的,不管这个风格是什么。是什么你都必须改。

而个人喜欢用什么风格则又是一回事。

对于这个问 ...

我喜欢大小写混合,
因为下划线增加了标识符的长度。

论坛徽章:
0
13 [报告]
发表于 2010-10-25 15:06 |只看该作者
回复 11# galaxywar


    你好!   
   这个代码我有点看不懂   我是用 c开发的

   
                 LTruncate(szBuffer, " \t");  //?????我我不知道这是干什么的 我查了资料也找不
                        RTruncate(szBuffer, " \t");   //?????我我不知道这是干什么的 我查了资料也找不

                        if(strcompi(szBuffer, lpKeyName))   //?????我我不知道这是干什么的 我查了资料也找不

                        {
                                continue;
                        }
                        else
                        {   /* 找到 */
                                bKeyFound = TRUE;
                                break;
                        }

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
14 [报告]
发表于 2010-10-25 15:16 |只看该作者
确实,大小写夹杂有点不舒服
还是小写和下划线好。


get_prv_string()

不过有个问题,就是单词如何简写。{:3_191:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP