300x250
반응형

비교를 하기 위해서 strlen함수를 호출하였다.

하나하나 읽어 가며 null이 들어가면 빠져나가도록 처리.

 

결과는 다음과 같다.

내가 입력한 만큼 나온다. 첫번째 size는 만든 함수, 두번째 size는 실제 strlen의 값이다.

 

 

728x90
300x250
반응형

오늘은 static변수 및 static 함수에 대해서 공부를 해볼 예정이다.

static변수및 함수. 정적 변수 와 정적 함수라고 표현 한다.

우리는 일반적으로 함수를 정의 하면 여러군대에서 호출 하여 사용 한다.

그러나 static 키워드를 붙이면 해당 소스 파일 내부에서만 사용이 가능 하다.

그럼 예제를 보도록 하자.

 

일반적으로 사용 하는 함수방식의 결과값이다. 

우리가 흔히 아는 방식으로 결과 값이 나온다.

 

만약에 다른 소스코드에 같은 함수명을 사용 한 경우는 어떨까?

test.c라는 파일을 추가 하고 똑같은 func1을 정의 하면 다음과 같은 에러가 발생.

중복으로 func1이 지정되어 있어서 컴파일 에러를 발생 시킨다.

 

이럴 때 static을 사용 하면 해당 에러가 사라진다.

둘중에 하나만 하던지 아니면 둘다 하는게 좋다.

개인적으로는 중복이 되는 네이밍이 있다면 중복되는 네이밍 전부 static을 붙여 주자.

 

static 키워드를 붙이면 해당 에러가 사라 진다.

 

static 변수.

static변수는 값이 계속 유지가 된다.

또한 global변수와 다르게 해당 코드 내에서만 호출이 가능하다.

 

 

728x90
300x250
반응형

간단하게 파일에 내용을 가져와서 사용을 해야 할 일이 있어서 테스트겸 만들어 보았다.

C++을 잘 사용 할 줄몰라서 C/C++를 혼용하여 사용 하였으면 최종 데이터 저장 컨테이너는

map으로 사용 하였고, 멀티맵을 하지 않은 이유는 겹치는 key는 발생 할 일이 없을 것으로 판단 하였다.

 

테스트 파일 원본.
//YAS.
DEMO 3

//Tuen.
TONVOLUME 22

//Max T
MAXVOLUME 45

//Reset Timer
RESETTIMER 0

//KEY PATEERN
KEY 2

//USBPLAY
//USBREPEAT ALL
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
#include <map>
#include <vector>

using namespace std;

typedef struct {
    string key;
    string value;
}USB_DATA;

map<string, string> mapData;

int TrimRight(char *p)
{
    int len = strlen(p);

    if(len <= 0)
    {
        p[0] = 0;
        return 0;
    }
    else
    {
        len--;
        while(len)
        {
            if((unsigned char)p[len] > ' ') break;

            p[len] = 0;
            len--;
        }
    }

    return strlen(p);
}

bool parsingData(char* str)
{
    int cnt = 1;
    char *tok = NULL;

    USB_DATA t_data;

    if(str != NULL)
    {
        if(str[0] == '/' && str[1] == '/')
        {
            return false;
        }
        TrimRight(str);

        tok = strtok(str, " ");
        if(tok == NULL)
        {
            return false;
        }

        t_data.key = tok;

        tok = strtok(NULL, " ");
        if(tok == NULL)
        {
            return false;
        }

        t_data.value = tok;
    }

    //printf("struct data[%s][%s]\n",t_data.key.c_str(), t_data.value.c_str());

    mapData.insert(make_pair(t_data.key, t_data.value));

    return true;
}

bool getDataFile()
{
    FILE    *fp = fopen("demo_mode3.txt","r");
    int     len = 0, total = 0;
    char    buff[64] = {0,};

    if(fp == NULL)
    {
        printf("file open fail\n");
        return false;
    }

    char *p;
    while(!feof(fp))
    {
        p = fgets(buff, sizeof(buff), fp);
        if(p != NULL)
            parsingData(p);
    }

    fclose(fp);

    return true;
}

void print_map()
{
    for(auto itr = mapData.begin(); itr != mapData.end(); ++itr)
    {
        cout << "key : " << itr->first << ", " << "value : " << itr->second << endl;
    }
}

int main(void)
{
    printf("Program parsing\n");

    getDataFile();

    print_map();

    return 1;
}

 

결과 값. 

 

위의 결과에서 주석은 제거, 빈공간 제거등을 하여서 데이터만 가져오도록 하였고,

데이터 구분은. ' '(스페이스)로 처리 되어있다.

728x90

+ Recent posts