首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

作业贴,100分,用!该怎么处理

2012-02-10 
作业贴,100分,急用!作业描述:读取一个ini文件到buffer中,根据ini文件中的主字段与次字段,查询ini文件输出

作业贴,100分,急用!
作业描述:
读取一个ini文件到buffer中,根据ini文件中的主字段与次字段,查询ini文件输出对应的数值(去除 '可能 '遇到的注释等内容)。
ini文件内容如下:
[First1]
        [Second1]=aaaa       //注释
        [Second2]=bbbb
[First2]
        [Second1]=cccc       //注释
        [Second2]=dddd
[First3]
        [Second1]=eeee       //注释
        [Second2]=ffff       /*注释*/



[解决办法]
输出是什么?
[解决办法]
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void cut(char *tmp)
{
char *ptr;
ptr=tmp;
if(tmp==NULL)return;
while(*ptr)
if(*ptr== '\n '||*ptr== '\r ')
{
*ptr=0;
break;
}
else ptr++;

int pos=0;
pos=strcspn(tmp, "// ");
ptr=tmp;
*(ptr+pos)= '\0 ';
pos=strcspn(tmp, "/* ");
*(ptr+pos)= '\0 ';
}
char * readini(char *filename,char *_group,char *_member,char *value)
{
FILE *file;
char buf1[1024],buf2[1024],buf3[1024];
int len,flag=0;
char *ptr,*str;
char *group,*member;
if(!_group||!_member)return NULL;

group=(char*)malloc(strlen(_group)+2);
member=(char *)malloc(strlen(_member)+2);

memset(group,0,strlen(_group)+2);
memset(member,0,strlen(_member)+2);

sprintf(group, "[%s] ",_group);
sprintf(member, "[%s] ",_member);

if((file=fopen(filename, "r "))==NULL)
{
free(group);
free(member);
return NULL;
}
memset(buf1,0,sizeof(buf1));

while(fgets(buf1,sizeof(buf1),file))
{
cut(buf1);
if(strlen(buf1)==0)continue;
if(strcmp(buf1,group)==0)
{
flag=1;
continue;
}
if(flag&&(strcspn(buf1,member)==0))
{
ptr=buf1;
ptr+=strlen(member);
ptr++;
strcpy(value,ptr);
break;
}
}
fclose(file);
free(group);
free(member);
return value;
}

int main()
{

char buf1[1024];
memset(buf1,0,sizeof(buf1));
readini( "test.txt ", "First2 ", "Second2 ",buf1);
printf( "%s\n ",buf1);
}

这个可用,不过没考虑换行的多行注释这中情况.

[解决办法]
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAXINISIZE 100
struct IniData_t
{
char *key1;
char *key2;
char *cont;
};
struct IniData_t iniData[MAXINISIZE];
int curSize=0;
int main()
{
char buffer[1000];
FILE *fp;
int i;
char inKey1[100],inKey2[100];
char *p,*st,*key1;

if( (fp=fopen( "1.txt ", "r "))==NULL ){return 0;}
buffer[fread(buffer,sizeof(char),1000,fp)]=0;
fclose(fp);
p=buffer;
while( *p )
{
st = strchr(p, '[ ');
if( st == NULL ){
break;
}
st++;
p = strchr(st, '] ');
*p=0;
if( *(++p)== '= ' )
{
if( curSize> =MAXINISIZE){ fprintf(stderr, "Overflow ");break;}
iniData[curSize].key1=key1;
iniData[curSize].key2=st;


iniData[curSize++].cont=p+1;
while( *(++p)!=0&&*p!= '\n '&&*p!= ' ' );
st=p;
p = strchr(p, '\n ');
*st=0;
p++;
}else
{
key1 = st;
}
}

for( i=0; i <curSize; i++ )
{
printf( "%s %s -> %s\n ",iniData[i].key1,iniData[i].key2,iniData[i].cont );
}

printf( "please input the first key: " );
scanf( "%s ", inKey1 );
printf( "please input the second key: " );
scanf( "%s ",inKey2 );
for( i=0; i <curSize; i++ )
{
if( strcmp(iniData[i].key1,inKey1)==0 && strcmp(iniData[i].key2,inKey2)==0 )
{
printf( "the value is: %s\n ",iniData[i].cont);
break;
}
}
if( i==curSize )
{
printf( "Error!\n ");
}


return 0;
}

[解决办法]
简单写了一下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int trim(char *szBuff);

int main(int argc,char *argv[])
{
char szFirst[128];
char szSecond[128] ;
char szValue[128] ;
FILE *fp;
char szBuff[256] ;
char *pCur = NULL ;

if ((fp = fopen(argv[1], "r ")) == NULL)
return -1;

memset(szFirst,0,sizeof(szFirst));
memset(szSecond,0,sizeof(szSecond));
memset(szValue,0,sizeof(szValue));

while (!feof(fp))
{
if (fgets(szBuff, sizeof(szBuff), fp) == NULL)
break ;

if( trim(szBuff) <0 )
continue ;

pCur = strchr(szBuff, '= ') ;
if( pCur != NULL ) //[Second1]
{
if( strlen(szFirst) == 0 )
{
printf( "INI error[%s]\n ",szBuff);
}
else
{
snprintf(szSecond,sizeof(szSecond), "%*.*s ",pCur-szBuff,pCur-szBuff,szBuff);
snprintf(szValue,sizeof(szValue), "%s ",pCur+1);
printf( "szFirst:%s szSecond:%s szValue:%s\n ",szFirst,szSecond,szValue);
}
}
else // [First1]
{
snprintf(szFirst,sizeof(szFirst), "%s ",szBuff);
}
}

fclose(fp);

return(0);
}

int trim(char *szBuff)
{
int iLen = strlen(szBuff) ;
char *pCur = NULL ;
int i,j ;

for( i = iLen-1 ; i > = 0 ; --i)
{
if( szBuff[i] == ' ' || szBuff[i] == '\r ' || szBuff[i] == '\n ' )
szBuff[i] = 0 ;
else
break ;
}

//去掉 /**/ 注释
iLen = strlen(szBuff) ;
if(strncmp(&szBuff[iLen-2], "*/ ",2) == 0 )
{
if( (pCur = strstr(szBuff, "/* ")) != NULL )
*pCur = 0 ;
else
return(-1);
}

//去掉后面的 // 注释
if( (pCur = strstr(szBuff, "// ")) != NULL )
*pCur = 0 ;

iLen = strlen(szBuff) ;

for( j = 0 ; j < iLen ; ++j)
{
if( szBuff[j] != ' ' && szBuff[j] != '\r ' )
break ;
}

if( j != 0 )
{


iLen = strlen(szBuff + j ) ;
for( i = 0 ; i <= iLen ; ++i)
szBuff[i] = szBuff[i+j] ;
}

return(0);
}

热点排行
Bad Request.