달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'삽질예방/간단한 파싱'에 해당되는 글 1

  1. 2008.02.27 환경설정파일 파싱
2008. 2. 27. 17:11

환경설정파일 파싱 삽질예방/간단한 파싱2008. 2. 27. 17:11

가장 간단한 형태로, #으로 주석처리가 가능하다.
환경설정파일로 부터 원하는 것을 파싱.

assert로 예외처리하는 스킬도 엿보임 ;)

<env_var.conf>
#### env_var.conf
ALPHA           15 #alsdfjalsdfj
BETA            1  
K               20
GAMMA           0.032
NUM_OF_THREAD   2  

#MAX_NUM_OF_THREAD 4


다음은 이를 읽어들이는 함수..
ret != 1조건은 비어있는 라인이 들어올 경우를 대비한다

int ReadEnvVarsFromFile()          
{
    char buf[1000];
    char varName[100];
    FILE* envFile;
    int ret;
    envFile = fopen(ENV_VAR_FILE_NAME, "r");

    while (NULL != fgets(buf, 1000, envFile)) {
        ret = sscanf(buf, "%s", varName);
        if (varName[0] == '#' || ret != 1)
            continue;
        
        if (0 == strcmp(varName, "ALPHA")) {
            sscanf(buf, "%s %d", varName, &ALPHA);
            printf("%s=%d ", varName, ALPHA);
        }
        else if (0 == strcmp(varName, "BETA")) {
            sscanf(buf, "%s %d", varName, &BETA);
            printf("%s=%d ", varName, BETA);
        }
        else if (0 == strcmp(varName, "K")) {
            sscanf(buf, "%s %d", varName, &K);
            assert(K <= MAX_K);
            printf("%s=%d ", varName, K);
        }
        else if (0 == strcmp(varName, "GAMMA")) {
            sscanf(buf, "%s %lf", varName, &GAMMA);
            printf("%s=%lf ", varName, GAMMA);
        }
        else if (0 == strcmp(varName, "NUM_OF_THREAD")) {
            sscanf(buf, "%s %d", varName, &NUM_OF_THREAD);
            assert(NUM_OF_THREAD <= MAX_NUM_OF_THREAD);
            printf("%s=%d ", varName, NUM_OF_THREAD);
        }   
        else
            assert(NULL == "Unknown variable name");
    }

    fclose(envFile);
    return 0;
}

:
Posted by Kwang-sung Jun