2015. 2. 13. 18:33

기존에 우리는 배열을 선언할때

int arr[5] = {1,2,3,4,5};

이렇게 선언이 가능했다.


그럼, class도 literal하게 선언이 가능할까?


해당사항은 c++98 컴파일러에서는 불가능 했는데,

c++11부터!  literal class로 선언 가능해 졌다.



#include <iostream>

class A
{
    public:
    int a;
    char b;
};


int main()
{
    A a = A{ 1, 'a'};
    std::cout << "a: " << a.a << "\tb: " << a.b << std::endl;
    return 0;

 



$ c++ -std=c+*98 main.cpp
main.cpp: In function ‘int main()’:
main.cpp:13:9: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
  A a = A{ 1, 'a'};
         ^ 

 

  c++98 컴파일러로 컴파일 하니 c++11 컴파일러로 하라고 친절하게 설명해 주었다. ㅋ

 extended initializer lists only available with -std=c++11 or -std=gnu++11

 

  

$ c++ -std=c++11 main.cpp
$ a.out
a: 1    b: a 


Posted by Triany
2014. 11. 24. 14:29

C컴파일러와, C++컴파일러가 호출하고자 하는 함수를 찾을때 참조하는 정보가 다르기 때문이다!!


* C 컴파일러 ( 함수 오버로딩 x )

 함수의 이름

C컴파일러는 호출하고자 하는 함수를 찾을 때 오로지 함수의 이름 정보만을 갖고 찾기 때문에 정의된 매개 변수의 형태가 달라도 동일한 이름의 함수 정의는 허용하지 않는다.


#overC.c

  1 #include <stdio.h>

  2

  3 int function(void)

  4 {

  5     return 0;

  6 }

  7 int function(int a, int b)

  8 {

  9     return a+b;

 10 }

 11

 12 int main()

 13 {

 14     function();

 15     function(1,2);

 16     return 0;

 17 }


$ gcc overC.c

overC.c:7: error: conflicting types for ‘function’

overC.c:3: note: previous definition of ‘function’ was here

overC.c: In function ‘main’:

overC.c:14: error: too few arguments to function ‘function’





* C++ 컴파일러 ( 함수 오버로딩O)

  함수의 이름 + 매개 변수의 정보

C++컴파일러는 호출하고자 하는 함수를 찾을 때 함수의 이름뿐만 아니라 매개 변수의 정보까지도 참조를 한다. 

즉 C++은 이름이 같고 매개 변수의 타입 혹은 개수가 다른 함수들의 정의를 허용한다.

 => 이를 함수 오버로딩이라고 한다!

#include <iostream>


int function(void)

{

    return 0;

}

int function(int a, int b)

{

    return a+b;

}


int main()

{

    function();

    function(1,2);

    return 0;

}

$ g++ -o overCPP overCPP.cpp

문제없이 동작한다.


출처 : 열혈강의 C++프로그래밍(윤성우저) 참고

Posted by Triany
2014. 6. 20. 14:56

# 전역 함수에 대한 friend 선언

friend 선언을 통해서 private로 선언된 멤버 변수의 접근을 허용


#include <iostream>


using std::endl;

using std::cout;


class Counter

{

    int val;

public:

    Counter()

    {

        val = 0;

    }

    void Print() const

    {

        cout << val << endl;

    }


    friend void SetX(Counter &c, int val); //friend선언


};

void SetX(Counter &c, int val)

{

    c.val = val; //private로 선언된 멤버 변수 접근

}




int main()

{

    Counter cnt;

    cnt.Print();


    SetX(cnt, 2002);

    cnt.Print();

    return 0;

}


$ 4-6-1

0

2002



출처 : 윤성우의 c++프로그래밍(열혈강의)

Posted by Triany
2014. 6. 20. 14:46

함수가 클래스의 멤버함수인 경우,

 const키워드를 뒤에 삽입가능한데,

이경우 함수에 속해있는 객체의 멤버변수를 변경할 수 없다.


#include <iostream>


using std::endl;

using std::cout;


class Counter

{

    int val;

public:

    Counter()

    {

        val = 0;

    }

    void Print() const

    {

        val = 1; //Error

        ocut << val << endl;

    }


};



int main()

{

    Counter cnt;

    cnt.Print();


    return 0;

}

$ gcc.sh 4-6-1.cpp

4-6-1.cpp: In member function ‘void Counter::Print() const’:

4-6-1.cpp:16: error: assignment of data-member ‘Counter::val’ in read-only structure

4-6-1.cpp:17: error: ‘ocut’ was not declared in this scope



Posted by Triany
2014. 6. 17. 11:52

[c++] 레퍼런스, reference, int &ref = val; 레퍼런스 변수, 별명!


 레퍼런스 

-> 별명!

# 레퍼런스를 선언하는 방법 

int & ref = val;



#레퍼런스의 특징

"레퍼런스를 가지고 하는 연산은 레퍼런스가 참조하는 변수의 이름을 가지고 하는 연산과 같은 효과를 지닌다."


#include <iostream>


using std::cout;

using std::endl;



int main(void)

{

    int val = 10;

    int &ref = val;


    val++;

    cout << " ref : " << ref << endl;

    cout << " val : " << val << endl;


    ref++;

    cout << " ref : " << ref << endl;

    cout << " val : " << val << endl;


    return 0;

}

$ 2-3-1

 ref : 11

 val : 11

 ref : 12

 val : 12



# 레퍼런스에 대한 명확한 이해

void function(void)

{

   int val;     //1

   val = 20;

   ...

   int &ref=val; //2

}


변수란? 메모리 공간에 할당된 이름을 의미한다. 우리는 그 이름을 통해 메모리 공간에 접근하게 된다.

위의 코드는 그 과정과 같다.

1) 메모리 공간 할당 & 이름 부여

2) 이름만 하나더 부여


C 언어에서는 하나의 메모리 공간에 하나의 이름만을 부여할 수 있었다.

즉 C 언어에서는 하나의 메모리 공간에 둘 이상의 이름을 부여하지 못했다.

하지만 C++에서는, 레퍼런스를 선언하게 되면

"이름이 존재하는 메모리 공간에 하나의 이름을 더 부여"할 수 있다.

"레퍼런스 변수는 생성되는 방법에 있어서만 차이를 보일 뿐 만들어지고 나면 완전히 같은 것이다.!"





여기서 이 예제가 가능한 이유가 되겠다!

(레퍼런스를 이용한 call by reference 예제!)

#include <iostream>


using std::endl;

using std::cout;



void Swap(int &fnum1, int &fnum2)

{

    int temp;

    temp = fnum1;

    fnum1 = fnum2;

    fnum2 = temp;

}



int main(void)

{

    int num1 = 10;

    int num2 = 20;


    cout << "[Swap]함수 호출 전 " << endl;

    cout << "num1 : " << num1 << endl;

    cout << "num2 : " << num2 << endl;




    Swap(num1, num2);

    cout << "[Swap]함수 호출 후 " << endl;

    cout << "num1 : " << num1 << endl;

    cout << "num2 : " << num2 << endl;


    return 0;

}

$ 2-3-2

[Swap]함수 호출 전

num1 : 10

num2 : 20

[Swap]함수 호출 후

num1 : 20

num2 : 10




call by reference예제를 막연히 봤을 때는,

"어떻게 저렇게 하는게 가능하지? 

 &는 C에서는 주소로 접근하는 것이었는데, 어떻게 swap연산이 되는걸까?"

하는 막연한 의문이 있었다! 바로 레퍼런스 변수를 제대로 몰랐기 때문이다.!


여기서 예제와 같이 사용하면, 

Swap함수에서 변수로 선언한 fnum1, fnum2가 메인함수에서 선언한 num1, num2의 

별명이 되어! 그대로 swap이 가능한 것이다.!

즉 같은 메모리 공간에 이름만 하나 더 부여해서 사용하기에! 

(지역함수가 매개변수에 대해 메모리 공간을 따로 할당받지 않는 것으로 보인다.!)

fnum1은 num1의 별명으로,

fnum2는 num2의 별명으로 쓰였다!



이 상황을 자세히 알아보기 위해!

아얘 변수들의 주소를 출력하기로 마음 먹었다.!


#include <iostream>


using std::endl;

using std::cout;



void Swap(int &fnum1, int &fnum2)

{

    int temp;

    temp = fnum1;

    fnum1 = fnum2;

    fnum2 = temp;

    cout << "fnum1의 주소: " << &fnum1 << endl;

    cout << "fnum2의 주소: " << &fnum2 << endl;



}



int main(void)

{

    int num1 = 10;

    int num2 = 20;

    cout << "num1의 주소: " << &num1 << endl;

    cout << "num2의 주소: " << &num2 << endl;



    cout << "[Swap]함수 호출 전 " << endl;

    cout << "num1 : " << num1 << endl;

    cout << "num2 : " << num2 << endl;




    Swap(num1, num2);

    cout << "[Swap]함수 호출 후 " << endl;

    cout << "num1 : " << num1 << endl;

    cout << "num2 : " << num2 << endl;


    return 0;

}


$ 2-3-2

num1의 주소: 0x7fffeb761724

num2의 주소: 0x7fffeb761720

[Swap]함수 호출 전

num1 : 10

num2 : 20

fnum1의 주소: 0x7fffeb761724

fnum2의 주소: 0x7fffeb761720

[Swap]함수 호출 후

num1 : 20

num2 : 10





주소들이 정확히 같은 것으로 볼 수 있다.!

같은 주소공간을 별명으로 가르키기에!

메인함수의 num1, num2값이 변경되지 않았다.!

레퍼런스를 이용하면 더 명시적으로 쉽게 코딩이 가능한 것으로 보인다.!



물론 포인터 연산으로 구현하는 방법도 있지만

레퍼런스를 사용하면 메인함수의 변수의 값을 바꾸는게 더 편해 보인다.!


(단점) main함수만 봐서는 swap함수가 call-ByValue인지 Call-By-Rerence인지 알 수 없다.

프로그램이 길어진다면 확인하기 힘들다. 이 단점때문에 레퍼런스를 사용하지 않는 편이 낫다고 하는 전문가들이 많다고 한다. 흠.. 나는 잘 모르겠다. 레퍼런스를 총한 call by Rerence편한듯ㅎ




(참고) 포인터를 이용한 call by reference

포인터를 이용해서 포인터가 가리키는 메모리 공간에 직접 접근 가능

#include <iostream>


using std::endl;

using std::cout;



void Swap(int * fnum1, int * fnum2)

{

    int temp;

    temp = *fnum1;

    *fnum1 = *fnum2;

    *fnum2 = temp;

}



int main(void)

{

    int num1 = 10;

    int num2 = 20;


    cout << "[Swap]함수 호출 전 " << endl;

    cout << "num1 : " << num1 << endl;

    cout << "num2 : " << num2 << endl;




    Swap(&num1, &num2);

    cout << "[Swap]함수 호출 후 " << endl;

    cout << "num1 : " << num1 << endl;

    cout << "num2 : " << num2 << endl;


    return 0;

}

$ 2-3-2

[Swap]함수 호출 전

num1 : 10

num2 : 20

[Swap]함수 호출 후

num1 : 20

num2 : 10




# 레퍼런스의 제약

"레퍼런스는 선언과 동시에 초기화 되어야 한다." 

따라서 아래의 코드는 Error!


int &ref1 //초기화 되지 않았으므로 ERROR

int &ref2 = 10; //상수가 올 수 없으므로 ERROR





#레퍼런스를 리턴하는 함수의 정의

#include <iostream>


using std::cout;

using std::endl;


int& increment( int &val )

{

    val++;

    return val;

}


int main(void)

{

    int n = 10;

    int &ref = increment(n);


    cout << " n : " << n << endl;

    cout << "ref: " << ref << endl;

    return 0;

}


$ 2-6-1

 n : 11

ref: 11




/*

매개변수로 선언된 레퍼런스 val은 지역 변수와 마찬가지로 함수의 호출이 완료되면 사라질 뿐이다. 

그러나 이름만 사라질 뿐, val이라는 이름이 붙어있는 메로리 공간까지 사라지는 것은 아니다!

*/




# 레퍼런스를 리턴하는 잘못된 형태의 함수

"지역변수는 레퍼런스로 리턴 할 수 없다"!

#include <iostream>


using std::cout;

using std::endl;


int & function(void)

{

    int val = 10;

    return val;

}



int main(void)

{

    int &ref = function();

    cout << ref << endl;


    return 0;


}



$ gcc.sh 2-6-2.cpp

2-6-2.cpp: In function ‘int& function()’:

2-6-2.cpp:8: warning: reference to local variable ‘val’ returned





/*

함수가 종료되면 function함수의 지역변수 val은 사라져 버린다.

제대로 출력 되었다고 하더라도 이는 보장받을 수 없는 값이다.

** 지역변수를 레퍼런스로 리턴하는 일은 없어야 한다.

*/





출처 : 윤성우의 열혈강의 c++ 프로그래밍

       

Posted by Triany
2014. 6. 13. 11:36

* pthread_create

 헤더

 #include  <pthread.h>

 원형

 int pthread_create(pthread_t * thread, const pthread_attr_t *attr,

     void* (*start_routine)(void*), void *arg);

 인자

 첫번째 : 생성된 스레드의 ID를 저장할 변수의 포인터 옴

 두번째 : 스레드 특징을 설정할때 사용됨, 주로 NULL이 옴

 세번째 : 스레드가 생성되고 나서 실행될 함수가 옴

 네번째 : 세번째 인자에서 호출될 함수에 전달하고자 하는 인자의 값


* pthread_join

 헤더

 #include <pthread.h>

 

 int pthread_join(pthread_t th, void **thread_return);

 인자설명

 첫번째 : 스레드 ID가 옴. 이 ID가 종료할 때까지 실행을 지연

 두번째 : 스레드 종료시 반환값 받음



정확하지 않은 tip!!

pthread_join의 반환값이 스레드 종료시 반환값인데,

스레드 종료할 때 return 보다는 pthread_exit 를 사용하는 것이 더 좋다!

(void * thr_fn1 을 void thr_fn1 로 잘못썻다가 계속 반환값을 이상한 값으로 받아오는 

 오류가 있었다. 스레드 종료값 넘겨줄 때는 pthread_exit가 더 좋은듯 )



예제코드

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>



void * thr_fn1(void *arg)

{

    printf("thread 1 returning \n");

    return ((void *) 1);

}


void * thr_fn2(void *arg)

{

    printf("thread 2 exiting \n");

    pthread_exit((void *)2);

}



int main(void)

{

    int err;

    pthread_t tid1, tid2;

    void *tret;


    err = pthread_create(&tid1, NULL, thr_fn1, NULL);

    if (err != 0 )

    {

        printf("can't create thread 1: %s\n", strerror(err));

        exit(err);

    }


    err = pthread_create(&tid2, NULL, thr_fn2, NULL);

    if(err != 0 )

    {

        printf("can't create thread 2 : %s\n", strerror(err));

        exit(err);

    }

    err = pthread_join(tid1, &tret);

    if (err != 0 )

    {

        printf("can't join with thread 1: %s\n", strerror(err));

        exit(err);

    }

    printf("thread 1 exit code %d\n", (int)tret);


    err = pthread_join(tid2, &tret);

    if ( err != 0 )

    {

        printf("can't jon with thread 2: %s\n", strerror(err));

        exit(err);

    }

    printf("thread 2 exit code %d\n", (int)tret);

    exit(0);

}


$ gcc 11-3.c -o 11-3 -lpthread

$ 11-3

thread 1 returning

thread 2 exiting

thread 1 exit code 1

thread 2 exit code 2



* 참고 : 유닉스 고급 프로그래밍 11-3 예제 참고

Posted by Triany
2014. 5. 27. 11:37

얼마전 스마트폰 메신저 txt파일을 백업받아 vi에서 열어보았더니 ^M이라는 이상한 기호를 발견했다.

웹에서 찾아보니, 개행문자 즉 줄바꿈 문자가 깨진 흔적이라고 한다.! 

주로 같은 파일안에 유닉스개행문자 / 도스 개행문자가 섞여 있을때 발생하는 현상이라고!

관련해서 내용을 구글링하다가 발견했다.


^M = \r 

간단히 해결해 보았다.


str = hello^M

str.repleace('r', '')


다음에 참고해 두기 위해 포스팅해보았다.



[내 블로그 안에서 비슷한 내용]

vi에서 ^M 지우기, 행끝의 캐럿 M기호 지우기


Posted by Triany
2014. 5. 23. 15:53

이 문서는 파이썬 2점대를 기준으로 작성되었습니다.

10 정규식

 

1-1 반복 메타 문자

반복 메타 문자

의미

*

0 이상 반복

ca*t ct, cat, caat, caaaat등과 매치

+

1 이상 반복

ca+t cat, caaaat등과 매치

?

0 혹은 1

ca?t ct, cat 매치된다.

{m}

m 반복

ca{2} caa 매치된다.

{m,n}

m회부터 n회까지 반복

ca{2,4}t caat, caaat, caaaat 매치

 

 

1-2 매칭 메타 문자

. : - 줄바꿈 문자를 제외한 모든 문자와 매치 (re.DOTALL모드 사용하면 줄바꿈 문자 매치)

 

^ : - 문자열의 시작과 매치

- [] 메타 기호 안에서 반대의 문자열의 취함 [^5] 5 아닌 문자

 

$ : - 문자열의 마지막과 매치

- [] 메타 기호안에서는 메타 기호로 사용되지 않고 순수한 $문자로 매치된다.

 

[] : - 문자 집합을 나타낸다. ( [abc] a, b, c 문자를 의미. == [a-c])

- [a-zA-Z0-9] 영문자 숫자를 의미

 

| : - a|b a 또는(or) b 의미

 

() : - 정규식을 그룹으로 묶는다.

 

 

[이스케이프 기호]

\\ : 역슬래쉬 문자 자체를 의미한다.

\d : 모든 숫자와 매치된다. [0-9]

\D : 숫자가 아닌 문자와 매치된다. [^0-9]

\s : 화이트 스페이스 문자와 매치된다. [\t\n\r\f\v]

\S : 화이트 스페이스 문자가 아닌 것과 매치된다. [^\t\n\r\f\v]

\w : 숫자 또는 문자와 매치된다. [a-zA-Z0-9_]

\W : 숫자 또는 문자가 아닌 것과 매치된다. [^a-zA-Z0-9_]

\b : 단어의 경계를 나타낸다. 단어는 영문자 혹은 숫자의 연속 문자열로 가정한다.

\B : \b 반대로 단어의 경계가 아님을 나타낸다.


※출처 : 프리렉 파이썬_이강성 저 

 

[ 참고 ] 파이썬 정리 포스팅들 

--------------------------------------------------

[파이썬] python 문자열 함수정리


[파이썬] python 리스트 함수정리


[파이썬] python 튜플 함수정리




[파이썬] python 정규식 정리

-------------------------------------------------------------------------------

Posted by Triany
2014. 5. 23. 15:52

이 문서는 파이썬 2점대를 기준으로 작성되었습니다.


10 함수

[람다함수]

lambda 콤마로 구분된 인수들 : #labmda x, y : x + y

 

[함수적 프로그래밍 - map 내장함수, 순서쌍 만들기]

map(f, X) #f:사상함수 X: 입력집합

X = [1,2,3,4,5]

Y = map(labda a:a*a, X)

map(None, [1,2,3], [4,5,6,7,8]) #순서쌍. 인수 None

                            #[(1,4), (2,5), (3,5),(None, 7), (None,8)]

cf)zip([1,2,3], [4,5,6,7,8]) #[(1,4), (2,5), (3,5)]

 

[함수적 프로그래밍 - filter 내장함수, 시퀀스 자료중 필터링하여 참인 요소만 출력]

filter(lambda x:x>2, [1,2,3,34]) #[3, 34]

 

[함수적 프로그래밍 - reduce 내장함수]

reduce( 함수, 시퀀스형[, 초기값] )

reduce(lambdz x, y : x+y, [1,2,3,4,5]) #15

 

[함수객체의 속성]

def f():

pass

f.__doc__ #문서 문자열

f.func_doc

f.__name__ #함수의 이름

f.func_name

f.func_defaults #기본 인수 값들

f.func_code #함수의 코드 객체

f.func_globals #전역 영역

 

[함수의 코드객체 func_code]

code = func_code

code.co_name #함수의 이름

code.co_argcount #필수적인 인수의 개수

code.co_nlocals #전체 지역 변수의

code.co_varnames #지역 변수의 이름들

code.co_code #코드 객체의 바이트 코드 명령어

code.co_names #바이트 코드가 사용하는 이름들

code.co_filename #코드 객체를 포함하는 파일 이름

code.co_flags #코드객체가 가변 인수(*args, 0x04) 키워드 인수(**kw, 0x08) 갖는지 검사

#(하위 두개의 비트는 내부적으로 사용)


※출처 : 프리렉 파이썬_이강성 저



[ 참고 ] 파이썬 정리 포스팅들 

--------------------------------------------------

[파이썬] python 문자열 함수정리


[파이썬] python 리스트 함수정리


[파이썬] python 튜플 함수정리




[파이썬] python 정규식 정리

-------------------------------------------------------------------------------

Posted by Triany
2014. 5. 23. 15:51

이 문서는 파이썬 2점대를 기준으로 작성되었습니다.

9 파일

[파일쓰기]

f = file('t.txt', 'w') # f = open('t.txt', 'w')

f.write(s) #문자열 파일에 기록

f.close()

 

[파일읽기]

f = file('t.txt') # f = open('t.txt')

s = f.read()

 

[라인단위로 파일읽기]

line = f.readline() # 번에 줄씩 읽는다.

list = f.readlines() #파일 전체를 라인 단위로 끊어서 리스트에 저장

f.readlines() #readlines 유사하지만 파일 전체를 한꺼번에 읽기 않고,

필요할 때문 읽어서 공급

 

[라인단위로 파일 쓰기]

f.writelines(lines) #리스트 안에 잇는 문자열을 연속해서 출력(list '\n'있는경우)

f.write(''.join(lines))

f.write('\n'.join(lines))(list '\n' 없는경우)

 

[파일에서 원하는 만큼의 문자읽기]

f.read(10) #f.read(num)

 

[파일 처리 모드]

파일 처리 모드

설명

r

읽기 전용

w

쓰기 전용

a

파일 끝에 추가(쓰기 전용)

r+

읽고 쓰기

w+

읽고 쓰기(기존 파일 삭제)

a+

파일 끝에 추가(읽기도 가능)

rb

이진 파일 읽기 전용

wb

이진 파일 쓰기 전용

ab

이진 파일 파일 끝에 추가(쓰기 전용)

rb+

이진 파일 읽고 쓰기

wb+

이진 파일 읽고 쓰기(기존 파일 삭제)

ab+

이진 파일 파일 끝에 추가(읽기도 가능

f = open('f.txt', 'a') #파일 추가 모드로 오픈

 

[임의 접근 파일]

f.seek(n) #파일의 n번째 바이트로 이동

f.seek(n, 1) #현재 위치에서 n바이트 이동(n 양수면 뒤쪽으로, 음수면 앞쪽)

f.seek(n, 2) # 마지막에서 n바이트 이동(n 보통 음수)

f.tell() #현재의 파일 포인터 위치 돌려줌

 

[파일 객체 method 요약]

file.close() #파일을 닫는다. 이상 입출력 없게

file.read([size]) #원하는 바이트 수만큼 파일에서 읽어온다. 인수를 지정하지 않으면 전체 파일 read

file.readline() #라인 하나를 읽어들인다. size 지정되면 읽을 있는 최대 바이트 수가

file.readlines() #전체 라인을 readline() 이용하여 읽어들인 라인을 리스트에 넣어서 리턴

file.write(str) #문자열 str 파일에 쓴다.

file.writelines(list) #문자열 리스트를 파일에 쓴다. 줄바꾸기가 자동으로 삽입되지는 않음

file.seek(offset[,whence]) #whence 기본값은 0. (0: 시작기준, 1:현재위치, 2:끝기준)

#offset만큼 떨어진 위치에 파일 포인터 위치

file.tell() #파일의 현재 위치를 리턴

file.flush() #버퍼가 채워지지 않았어도 내부 버퍼의 내용을 파일에 보낸다.

file.fileno() #file객체의 파일 기술자(File Descriptor)(정수) 리턴

file.isatty() #만일 file객체가 tty 같은 장치이면 1 아니면 0 리턴

file.truncate([size]) #파일 크기를 지정된 크기로 잘라 버림. 인수를 주지 않으면 현재 위치에서 자름

 

[파일 객체 속성]

file.closed #file close 되었으면 1, 아니면 0

file.mode #파일이 오픈된 모드

file.name #open() 사용된 파일 이름

file.softspace #1이면 print문을 사용할 출력 사이에 자동적으로 스페이스 출력됨.

#0이면 스페이스가 자동으로 삽입되지 않음

 

[표준 .출력 방향 전환]

import stys

sys.stdout #표준 출력

sys.stderr #표준 에러

sys.stdin #표준 입력

sys.stdout = f = StringIO.StringIO() #출력 파일 방향 전환

s = f.getvalue() #내부 문자열 가져오기

f = StringIO.StringIO(s) #문자열 객체에서 파일 객체 얻어내기

 

[지속모듈 -DBM]

#사전 자료형과 사용법 유사

#키와 값은 반드시 문자열이어야

import anydbm

f = anydbm.open('music', 'c') #'c' 파일이 없으면 생성하고 읽기로 오픈

 

[지속모듈-피클링] #임의의 파이선 객체 저장

import pickle

pickle.dump(출력할 객체, 파일 객체) #객체를 파일로 출력

object = pickle.laod(파일 객체) #객체에서 파일 읽어 들임

#문자열로 객체를 출력, 문자열에서 객체 읽어들이려면.. dumps, loads

s = pickle.dumps(출력할 객체) #출력할 객체 피클링

 

object = pickle.load(s) #언픽클링


※출처 : 프리렉 파이썬_이강성 저 

Posted by Triany