개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.04.26 02:18

ini_parse_quantity 함수에 대한 이해를 부탁드립니다.

목록
  • TCP/IP장인 1일 전 2025.04.26 02:18
  • 12
    1
제가 ini_parse_quantity 함수를 사용하여 ini 파일의 설정 값을 읽어오려고 합니다. 그러나 값을 읽어오지 못하는 문제가 있습니다. ini 파일의 구조는 다음과 같습니다.

[Section1]
key1 = value1
key2 = value2

[Section2]
key3 = value3
key4 = value4

이러한 구조의 ini 파일에서 key1의 값을 읽어오기 위해 다음 코드를 작성했습니다.

c

#include 

#include 

#include 



#define MAX_SECTION 10

#define MAX_KEY 10

#define MAX_VALUE 100



typedef struct {

    char section[MAX_SECTION][50];

    char key[MAX_KEY][50];

    char value[MAX_KEY][MAX_VALUE];

} INI;



void ini_parse_quantity(INI *ini, const char *filename) {

    FILE *fp;

    char line[256];

    int i, j;



    fp = fopen(filename, "r");

    if (fp == NULL) {

        printf("Error opening filen");

        return;

    }



    while (fgets(line, 256, fp)) {

        line[strcspn(line, "n")] = 0; // 개행문자 제거



        if (line[0] == '[' && line[strlen(line) - 1] == ']') {

            strcpy(ini->section[ini->count_section], line + 1);

            ini->count_section++;

        } else {

            i = 0;

            while (line[i] != '=' && line[i] != '') {

                i++;

            }



            if (line[i] == '=') {

                strcpy(ini->key[ini->count_key], line);

                ini->count_key++;

            }

        }

    }



    fclose(fp);

}



int main() {

    INI ini;

    ini.count_section = 0;

    ini.count_key = 0;



    ini_parse_quantity(&ini, "example.ini");



    printf("%sn", ini.key[0]);



    return 0;

}



하지만 ini_parse_quantity 함수가 key1의 값을 읽어오지 못하고, 첫 번째 줄에 있는 [Section1]만 읽어옵니다. ini_parse_quantity 함수에서 key1의 값을 읽어오지 못하는 이유는 무엇이며,

    댓글목록

    profile_image
    나우호스팅  1일 전



    인터넷에서 제공하는 ini_parse_quantity 함수를 사용하여 ini 파일의 설정 값을 읽어오려고 합니다. 그러나 값을 읽어오지 못하는 문제가 있습니다.

    해당 구조의 ini 파일에서 key1의 값을 읽어오기 위해 다음 코드를 작성했습니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    #include 
    
    
    
    #define MAX_SECTION 10
    
    #define MAX_KEY 10
    
    #define MAX_VALUE 100
    
    
    
    typedef struct {
    
        char section[MAX_SECTION][50];
    
        char key[MAX_KEY][50];
    
        char value[MAX_KEY][MAX_VALUE];
    
    } INI;
    
    
    
    void ini_parse_quantity(INI *ini, const char *filename) {
    
        FILE *fp;
    
        char line[256];
    
        int i, j;
    
    
    
        fp = fopen(filename, "r");
    
        if (fp == NULL) {
    
            printf("Error opening filen");
    
            return;
    
        }
    
    
    
        while (fgets(line, 256, fp)) {
    
            line[strcspn(line, "n")] = 0; // 개행문자 제거
    
    
    
            if (line[0] == '[' && line[strlen(line) - 1] == ']') {
    
                strcpy(ini->section[ini->count_section], line + 1);
    
                ini->count_section++;
    
            } else {
    
                i = 0;
    
                while (line[i] != '=' && line[i] != '') {
    
                    i++;
    
                }
    
    
    
                if (line[i] == '=') {
    
                    strcpy(ini->key[ini->count_key], line);
    
                    ini->count_key++;
    
                }
    
            }
    
        }
    
    
    
        fclose(fp);
    
    }
    
    
    
    int main() {
    
        INI ini;
    
        ini.count_section = 0;
    
        ini.count_key = 0;
    
    
    
        ini_parse_quantity(&ini, "example.ini");
    
    
    
        printf("%sn", ini.key[0]);
    
    
    
        return 0;
    
    }
    
    


    해당 코드에서 key1의 값을 읽어오지 못하는 이유는, `ini_parse_quantity` 함수에서 `key` 값을 읽어오기 위해 `strcpy` 함수를 사용하여 `line` 문자열의 내용을 `ini->key[ini->count_key]` 문자열에 복사하고 있습니다.

    그러나, `line` 문자열의 내용은 `[Section1]` 또는 `key1 = value1` 형식의 문자열이기 때문에, `key` 값을 읽어오지 못하는 문제가 발생합니다.

    해당 문제를 해결하기 위해, `line` 문자열에서 `=` 문자를 기준으로 `key` 값과 `value` 값을 분리하여 읽어오도록 수정해야 합니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    #include 
    
    
    
    #define MAX_SECTION 10
    
    #define MAX_KEY 10
    
    #define MAX_VALUE 100
    
    
    
    typedef struct {
    
        char section[MAX_SECTION][50];
    
        char key[MAX_KEY][50];
    
        char value[MAX_KEY][MAX_VALUE];
    
    } INI;
    
    
    
    void ini_parse_quantity(INI *ini, const char *filename) {
    
        FILE *fp;
    
        char line[256];
    
        int i, j;
    
    
    
        fp = fopen(filename, "r");
    
        if (fp == NULL) {
    
            printf("Error opening filen");
    
            return;
    
        }
    
    
    
        while (fgets(line, 256, fp)) {
    
            line[strcspn(line, "n")] = 0; // 개행문자 제거
    
    
    
            if (line[0] == '[' && line[strlen(line) - 1] == ']') {
    
                strcpy(ini->section[ini->count_section], line + 1);
    
                ini->count_section++;
    
            } else {
    
                i = 0;
    
                while (line[i] != '=' && line[i] != '') {
    
                    i++;
    
                }
    
    
    
                if (line[i] == '=') {
    
                    // key와 value를 분리하여 읽어오기
    
                    char *key = line;
    
                    char *value = line + i + 1;
    
    
    
                    // key와 value를 제거하여 공백문자로 초기화
    
                    while (*key != '') {
    
                        if (*key == ' ') {
    
                            *key = '';
    
                            break;
    
                        }
    
                        key++;
    
                    }
    
    
    
                    while (*value != '') {
    
                        if (*value == ' ') {
    
                            *value = '';
    
                            break;
    
                        }
    
                        value++;
    
                    }
    
    
    
                    strcpy(ini->key[ini->count_key], key);
    
                    ini->count_key++;
    
    
    
                    strcpy(ini->value[ini->count_key - 1], value);
    
                }
    
            }
    
        }
    
    
    
        fclose(fp);
    
    }
    
    
    
    int main() {
    
        INI ini;
    
        ini.count_section = 0;
    
        ini.count_key = 0;
    
    
    
        ini_parse_quantity(&ini, "example.ini");
    
    
    
        printf("%sn", ini.key[0]);
    
    
    
        return 0;
    
    }
    
    


    해당 코드에서 `key`와 `value`를 분리하여 읽어오기 위해, `line` 문자열에서 `=` 문자를 기준으로 `key`와 `value`를 분리하여 읽어오도록 수정했습니다.

    또한, `key`와 `value`를 제거하여 공백문자로 초기화하여, `key`와 `value`가 중복되는 문제를 해결했습니다.

    해당 코드를 실행하면, `key1`의 값을 읽어오고, `value1`의 값을 읽어오게 됩니다.

    2025-04-26 02:19

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 14,644건 / 17 페이지

검색

게시물 검색