2014. 5. 23. 15:50

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

8 객체의 복사 변환

 

[copy 모듈을 이용한 객체 복사]

import copy

y = copy.copy(x) #얕은 복사

y = copy.deepcopy(x) #깊은 복사

 

[수치형변환 - 1)정수형 변환]

int(1.1) #1 #내장함수 int()

rount(1.1) #1.0 #반올림하여 정수형의 실수취함

import math

math.floor(1.1) #1.0 #내림연산

math.ceil(1.1) #2.0 #올림 연산

 

[수치형변환 - 2)실수, 롱형으로의 변환]

float(10) #10.0 #실수형으로 변환

long('1234') #1234 #롱형 정수로 변환

complex(1, 3) #(1+3j) #복소수 형으로 변환

 

[시퀀스 자료형 변환]

list('abcd') #list() 리스트로 변환

tuple('abcd') #tuple() 튜플로 변환

 

[문자열로의 변환]

str([1,2,]) #비형식적인 문자열 변환

repr([1,2]) #형식적인 문자열 변환

eval('[1, 2]') #[1,2] #문자열 '[1,2]' 로부터 역으로 리스트 생성

#eval 문자열로 표현식을 실행하는 내장함ㅅ

 

[문자열 요소를 가지는 리스트나 튜플을 문자열로 변환]

L = ['Pyton', 'is', 'the', 'first', 'language']

' '.join(L) #문자열로 합침

 

[리스트, 튜플, 사전의 변환]

사전 -> 리스트

D = {1:'one', 2:'two'}

D.key() #키값 리스트로

D.value() #value 리스트로

D.items() #[(key, value) ...]

리스트 ->사전

key = ['a', 'b']

value = [1,2]

D =dict( zip(key, values))

 

[문자변환]

chr(97) #ascii ->문자

ord('a') #문자->ascii

 

[진수변환]

int('64', 16) #16진수 '64' 10진수로

int('144', 8) #8진수 '144' 10진수로

int('101111', 2) #2진수 '101111' 10진수로

int('14', 5) #5진수 '14' 10진수로

hex(100) #10진수를 16진수로

oct(100) #10진수를 8진수로

 

[정수를 콤마가 있는 문자열로 변환]

import locale

locale.setlocale(locale.LC_ALL, "") #사용자 기본환경으로 설정

print locale.format("%d", 10030405, 1) #'10,030,405


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



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

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

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


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


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




[파이썬] python 정규식 정리

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

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

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

7 사전 집합

[사전 객체 생성 방법 - zip사용]

key = ['one', 'two', 'three'] #시퀀스 자료형이면 ok

values = (1,2,3)

zip(keys, values) #zip 자료를 순서대로 묶어준다. 사전의 items()출력과 동일

dict(zip(keys, values)) #{'three':3, 'two':2, 'one':1}

 

[사전 객체의 메소드]

D.keys() #사전에서 키들을 리스트로 리턴

D.values() #값들을 리스트로 리턴

D.items() #(key, value)리스트 리턴

key in D #멤버십 테스트. D key 가지고 잇으면 True

D.clear( ) #사전 D 모든 아이템 삭제

D.copy() #사전 복사(Shallow copy)

D.get(key [,x]) #값이 존재하면 D[key], 아니면 x 리턴

D.setdefault(key [,x]) #get 같으나 값이 존재하지 않을 값을 설정(D[key] = x)

D.update(b) #for k in b.keys(): D[k] = b[k]

D.popitem() # (, ) 튜플을 리턴하고 사전에서 항목을 제거한다.

D.pop(key) #key항목의 값을 리턴하고 사전에서 제거한다.

 

[집합자료형_set, frozenset 공통함수]t #순서 없는 자료형

len(s) #원소의

x in s #x 집합 s 원소인가?

x not in s #x 집합 s 원소가 아닌가?

s.issubset(t) #s t 부분집합?

s.issuperset(t) #s t 포함집합?

s.union(t) s | t #새로운 s t 합집합

s.intersection(t) #새로운 s t 교집합 s & t

s.difference(t) #새로운 s t 차집합 s - t

s.symmetric_difference(t) #새로운 s t 배타집합 s ^ t

s.copy() #집합 s 얕은 복사

list(a) #시퀀스 (리스트 형으로 변환)

tuple(a) #튜플으로 변환

 

[집합자료형_set 자료형만 가능한 연산]

s.update(t) #s t 합집합을 s 저장

s.intersection_update(t) #s t 교집합을 s 저장

s.difference_update(t) #s t 차집합을 s 저장

s.symmetric_difference_update(t) #s t 배타집합을 s 저장

s.add(x) #원소 x s 추가

s.remove(x) #원소 x s에서 제거: 없으면 Key Error 예외 발생

s.discard(x) #원소 x 있다면 s에서 제거

s.pop() #s에서 임의의 원소를 하나 리턴하고 집합에서는 제거; 집합이면 KeyError 예외 발생

s.clear() #집합 s 모든 원소 삭제


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



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

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

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


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


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




[파이썬] python 정규식 정리

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

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

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

6 튜플 

 

L = list(T) #tuple->list

T = tuple(L) #list->tuple

 

[경로명 다루기 - os.path]

>>>import os

p = os.path.abspath('t.py') #상대 경로 -> 절대경로

os.path.exists(p) #파일의 존재여부

os.path.getsize(p) #파일 크기

os.path.split(p) #(head, tail) 분리. (디렉토리명, 파일명)

os.path.join('c:\\work', 't.hwp') #디렉토리와 파일명 결합

os.path.normpath('c:\\work\\.\\t.hwp') #파일명 정규화

os.path.splitext('c:\\work\\t.hwp') #('c:\\work\\t', '.hwp')

os.linesep #파일의 라인분리문자 ( 윈도우:'\r\n', 유닉스:'\n', 맥킨토시 : '\r')

os.sep #경로명에서 요소 분리 (윈도우 :'\', 유닉스:'/', 매킨토시 : ':')

os.pathsep #경로명과 경로명을 구분해 주는 문자 (윈도우 ';' 유닉스 ':')

os.curdir #현재 디렉토리를 나타내는 문자, (윈도우, 유닉스 : '.' , 매킨토시 : ':')

os.pardir #부모 디렉토리를 나타내는 문자 (윈도우 유닉스 : '..", 매킨토시 '::')

 

[URL 다루기]

import urlparse

urlparse(urlstring[, default_scheme[, allow_fragments]]) #url 분리하여 튜플 리턴

u = urlparse.urlparse(a)

#(addressing scheme, network location, path, parameters, query, fragment identifier)

urlparse.unurlparse(u) #튜플로 성분들을 하나의 url 역변환

urljoin(base, url[, allow_fragments]) #기본 URL 상대 URL 연결하여 절대 URL 생성


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


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

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

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


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


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




[파이썬] python 정규식 정리

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

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

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


5 리스트

 

del a[0] #리스트 삭제

 

[리스트 메소드]

메소드

설명

append

자료를 리스트 끝에 추가(혹은 스택의 push)

s.append(5)

insert

자료를 지정된 위치에 삽입 insert('index', 'value')

s.insert(3,4)

index

요소 검색(Search) index('value')

s.index(3)

count

요소 개수 알아내기 count('value')

s.count(2)

sort

리스트 정렬

s.sort()

reverse

자료순서 바꾸기

s.reverse()

remove

지정 자료 삭제 remove('value')

s.remove(2)

pop

리스트의 지정된 하나를 읽어 내고 삭제(스택의 Pop)

s.pop()

extend

리스트를 추가

s.extend([60,70])

 

[스택]

s.append(60) #push

s.pop() #pop

 

[]

s.append(60) #inqueue

s.pop(0) #dequeue

 

cmp : 내장함수를 이용하여 정렬할 순서를 결정한다.

cmp(a, b)

cmp (a, b) 조건

결과

a < b

-1

a = b

0

a > b

1

            

[역순정렬]

L.sort(reverse=True)

L.sort() #리턴되는 값은 없다. L 자체가 sorting

newList = sorted(L) #L 변경내용이 없고, 새로운 리스트가 리턴

 

L.reverse() #순서 뒤집기

 

[명령행 인수 얻기]

import sys

print sys.argv #인수들의 리스트

 

[명령행 옵션 처리]

import getopt

optlist, args = getopt.getopt(인수리스트, 옵션문자) # optlist('-a', '') # args # ['spam', 'and', 'ham']

옵션문자에 : 사용되면 옵션에 추가 인수 받아들임

 

[array 모듈] #표준모듈

타입 코드

C 타입

최소 바이트

'c'

Character

1

'b'

Signed integer

1

'B'

Unsigned integer

1

'h'

Signed integer

2

'H'

Unsigned integer

2

'i'

Signed integer

2

'I'

Unsigned integer

2

'l'

Signed integer

4

'L'

Unsigned integer

4

'f'

Floating poinnt

4

'd'

Floating point

8

배열만들기 함수 사용

array(typecode [, initializer]) # 배열 생성

 

[디렉토리 파일 목록 얻기]

? : 임의의 문자 1개와 매칭

* : 임의 개수(0 포함) 모든 문자와 매칭

[...] : 괄호 안의 임의의 1 문자와 매칭

>>> import glob

>>> glob.glob('./[0-9].*')

>>> glob.glob('*.gif')

 

[파일의 추가 정보 알아내기]

isfile(path) - path 일반파일이면 True 리턴

isdir(path) - path 디렉토리(폴더)이면 True 리턴

islink(path) - path 심볼릭 링크이면 True 리턴

ismount(path) - path 마운트 포인트이면 True 리턴(unix)

axists(path) - path 존재하면 True 리턴

 

>>> import glob

>>> import os

>>> os.path.getsize('t.py') #파일의 크기를 얻는다.

 

>>> import time

>>> t = os.path.getatime('t.py') #파일의 최근 접근 시간을 얻음

>>> t #리턴되는 숫자는, 기준 시간(1970 1 1 자정)부터 현재까지 경과한 .

 

>>> time.ctime(t) # 문자열 시간으로 변환

>>> time.ctime(os.path.getmtime('t.py')) #파일의 수정(modified)시간

 

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

 


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

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

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


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


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




[파이썬] python 정규식 정리

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

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

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

4 문자열

 

[문자열 대치 기능]

>>>import string

t = string.Template('$page: $title')

t.substitute({'page':2, 'title' : 'The Best of Times'})

t.safe_substitute({'page':2}) #누락된 key 대해 Error 없음.

 

[문자열 메소드 - 1). 소문자의 변환]

s.upper() #대문자로 변환

s.upper().lower() #소문자로 변환

s.swapcase() # 대문자 -> 소문자, 소문자 -> 대문자

s.capitalize() # 첫문자를 대문자로

s.title() #단어의 첫문자를을 대문자로

 

[문자열 메소드 - 2)검색]

s.count('like') #문자열 s에서 'like'라는 문자열이 발생한 횟수 리턴

s.find('like') #문자열 s에서 'like' 옵셋 리턴.(검색), 찾는 문자열 없을 경우 -1리턴

s.find('like', 3) #문자열 3 위치부터 검색

s.rfind('like') #find 같지만 문자열 s 뒤족부터 탐색

s.index('like') #문자열 s에서 'like' 옵셋 리턴.(검색), 찾는 문자열 없을 경우 예외발생

s.rindex('like') #index 같지만 문자열 s 뒤족부터 탐색

s.startswitch('i like') #i like 시작하는 문자열인가? 리턴 : True, false

s.endwith('swimming') #swimming으로 끝나는 문자열인가? 리턴 : True, false

s.startswitch('i like', 7) #7번째 문자열이 i like 시작하는 문자열인가? 리턴 : True, false

s.endwith('swimming', 0, 26) #0부터 26번째 위치 사이의 문자열이 swimming으로 끝나는가?리턴 : True, false

 

[문자열 메소드 - 3)편집, 치환]

s.strip() #좌우 공백을 없앰

s.rstrip() #오른쪽 공백을 없앰

s.lstrip() #왼쪽 공백을 없앰

s.strip('<>') #'<>' 없앰

s.replace('spam', 'spam and egg') #'spam' 'spam and egg' 바꿈

 

[문자열 메소드 - 4)분리, 결합]

s.split() #공백으로 분리

s.split('and') #'and' 기준으로 분리

':'.join(s) #':'문자로 결합.

print '\n'.join(t) # 바꾸기로 결합

lines.splitlines() #라인 단위로 분리

s.split(':', 2) #두번만 분리

s.rsplit(':', 1) #오른쪽부터, 한번만 분리

 

[문자열 메소드 - 5)정렬]

s.center(60) #전체 60 문자의 가운데에 맞춘다.

s.ljust(60) #왼쪽에 맞춘다.

s.rjust(60)          #오른쪽에 맞춘다.

             #center, ljust, rjust 메소드는 채워질 문자를 선택할 있다.

s.center(60,'-') #공백 대신 '-'문자를 채운다.

s.ljust(60,'-')

s.rjust(60,'-')    

'1\tand\t2'.expandtabs() # 문자 -> 8 공백으로

'1\tand\t2'.expandtabs(4) # 문자 -> 4 공백으로

 

[문자열 메소드 - 6)구성 문자열 판별]

s.isdigit() # 숫자여부 파악 , 리턴 : True, False

s.isalpha() # 영문자여부 파악 , 리턴 : True, False

s.isalnum() # 숫자 혹은 영문자 여부 파악 , 리턴 : True, False

s.islower() # 소문자여부 파악 , 리턴 : True, False

s.isupper() # 대문자여부 파악 , 리턴 : True, False

s.isspace() # 공백 문자 여부 파악, 리턴 : True, False

s.istitle() # 제문 문자열 여부 파악, 리턴 : True, False

 

[문자열 메소드 - 7)채우기 자리 맞추기 문자열]

s.zfill(5) # 0으로 채워진다.

# ex)

>>>s = '123'

>>>s.zfill(5)

'00123'

>>>'goofy'.zfill(6)

'0goofy'

 

[string 모듈]

# 상수 정의. 임의의 문자가 어떤 구룹에 속해있는지 판별할때 유용

string.digits #'0123456789'

string.octdigits #'01234567'

string.hexdigits #'0123456789abcdefABCDEF'

string.letters #'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

string.lowercase #'abcdefghijklmnopqrstuvwxyz'

string.uppercase #'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

string.puctuation #'!"#$%\ .....'

string.printable #인쇄가능한 문자들 모두

string.whitespace #공백 문자 모두(8진수 표현)

#ex)

>>> x = 'a'

>>> x in string.uppercase

False

 

[유니코드]

u'String' #유니코드 표현 문자열

unicode('한글') #유니코드 문자열로 변환

[포맷 문자열]

포맷 문자열

설명

%s

문자열 혹은 임의의 객체를 문자열로 변환한다. (str() 함수를 이용한다.)

%r

문자열 혹은 임의의 객체를 문자열로 변환한다. (repr() 함수를 이용한다.)

%c

길이 1 문자 %c, % A

%d

10 정수

%i

정수(%d와의 차이가 없다)

%u

부호 없는 정수 %u%-12 결과는 4294967284양수는 그대로,

음수는 양수적 해석을 적용한다.

%o

8진수 %o % 12 결과는 14

%x

16진수 %x %12 결과는 c

%X

16진수 대문자 %X %12 결과는 C

%e

부동 소수점(실수) 지수 형태로 표현. 유효 숫자는 7자리로 표현한다.

%e %123.45678 결과는 1.234568e+002

%E

%e 동일하다. , 지수 표현을 대문자 E 한다.

%f

부동 소수점(실수) 표현 %f % 123.45678 결과는 123.456780

%g

부동 소수점을 편의에 따라서 소수점 형식 혹은 지수 형식으로 변환한다.

6자리의 유효 숫자로 표현한다.

%G

%g 같다. , 지수 표현을 대문자 E 한다.


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


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

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

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


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


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




[파이썬] python 정규식 정리

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

'Language > python' 카테고리의 다른 글

[파이썬] python 튜플 함수정리  (0) 2014.05.23
[파이썬] python 리스트  (0) 2014.05.23
콘솔에 print 시, 커서위치 맨 앞으로 위치시키기 "\r"  (0) 2014.05.20
sqllite3 _ in python  (0) 2012.08.01
[python] 엑셀작업  (1) 2012.05.10
Posted by Triany
2014. 5. 22. 15:07


헤더 string.h

형태 size_t strlen( const char *str)

인수 char *str 길이를 구할 문자열

반환 문자열 길이를 바이트 단위로 반환합니다.


#include <stdio.h>

#include <string.h>

int main()

{

    char * a = "apple";

    printf ("length = %d,  %s \n" , strlen(a), a);

}

$ ./a.out

length = 5,  apple


Posted by Triany
2014. 5. 20. 11:31

"\r" : 줄의 맨 처음의 의미


왜 필요한지 모르겠는데, 친구가 python에서 콘솔에 계속 덮어쓰는 식으로 구현할 수 있는지 물어봐서 찾아보다가 포스팅을 하게 된다. \r을 이용한 예제는 어디선가 참조하였고 밑의 예제는 직접실습해서 꾸려보았다.

c언어에서도 \r을 이용하여 printf문에서 덮어쓰듯?? 표현할 수 있다는데

파이썬도 \r을 이용해서 구현하는 것은 동일한 것으로 보인다.

그럼 아래 예제를 살펴보자


1. \r을 이용한 예제 1

>>> a='\rabc'

>>> a

'\rabc'

>>> print a

abc


\r을 이용하면 문자를 줄의 맨 처음에 위치 시킬 수 있다.

이 예제를 응용하면,, 


2. for문으로 print시 덮어쓰기!!

>>> abc = ['apple', 'banana', 'orange', 'ear']

>>> for i in abc:

...     print '\r'+i,

...

earnge


print 시 ,(콤마)를 쓰면 줄을 바꾸지 않고 띄어쓰기를 해서 인식하게 된다.

콘솔의 맨 앞줄에 계속 덮어쓰기 식으로 이용하기 위해서는 줄이 바뀌면 안되니까

콤마를 이용해주자.


만약 콤마를 쓰지 않는다면 이 예제는 도로묵이된다.

>>> for i in abc:

...     print '\r'+i

...

apple

banana

orange

ear



참고참고


'Language > python' 카테고리의 다른 글

[파이썬] python 튜플 함수정리  (0) 2014.05.23
[파이썬] python 리스트  (0) 2014.05.23
[파이썬] python 문자열 함수정리  (0) 2014.05.23
sqllite3 _ in python  (0) 2012.08.01
[python] 엑셀작업  (1) 2012.05.10
Posted by Triany
2014. 5. 15. 17:41

[유닉스고급프로그래밍] 4-22 디렉터리 계통구조를 재귀적으로 따라 내려가면서 파일 종류 통계를 구하는 프로그램

APUE2 소스해석


#include "apue.h"

#include <dirent.h>

#include <limits.h>


typedef int Myfunc(const char * , const struct stat * , int);


static Myfunc myfunc;

static int myftw(char *, Myfunc *);

static int dopath(Myfunc * );


static long nreg, ndir, nblk, nchr, nfifo, nslink, nsock, ntot;


int main(int argc, char *argv[])

{

    int ret;

    if (argc != 2)

        err_quit("usage : ftw <starting-pathname>");


    ret = myftw(argv[1], myfunc); /*실제 잡업을 수행*/


    ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock;


    if ( ntot == 0 )

        ntot = 1;


    printf("regular files = %7ld, %5.2f %%\n", nreg, nreg*100.0/ntot);

    printf("directories = %7ld, %5.2f %%\n", ndir, ndir*100.0/ntot);

    printf("block special = %7ld, %5.2f %%\n", nblk, nblk*100.0/ntot);

    printf("char special = %7ld, %5.2f %%\n", nchr, nchr*100.0/ntot);

    printf("FIFOS files = %7ld, %5.2f %%\n", nfifo, nfifo*100.0/ntot);

    printf("symbolic links = %7ld, %5.2f %%\n", nslink, nslink*100.0/ntot);

    printf("sockets = %7ld, %5.2f %%\n", nsock, nsock*100.0/ntot);


    exit(ret);


}


#define FTW_F 1

#define FTW_D 2

#define FTW_DNR 3

#define FTW_NS 4


static char * fullpath; /* 각파일의 전체 경로이름을 담음*/


//여기서 수행

static int myftw(char * pathname, Myfunc *func) /*func()의 반환값을 그대로 돌려줌 */

{

    int len;

    fullpath = path_alloc(&len); /*PATH_MAX+1*/ //apue에서 제공해주는 함수. 운영체제 환경에 따라 사용할 수 있는 공간의 최대 크기를 리턴해 주는 함수인듯.


    strncpy(fullpath, pathname, len);

    printf("fullpath: %s\n", fullpath);

    fullpath[len-1] = 0;


    return(dopath(func));

}



/* fullpath에서부터 계통구조를 따라간다

   fullpath가 디렉터리가 아니면 lstat()으로 정보를 얻어서

   func()를 호출하고 반환. 디렉터리면 그 디렉터리의 각 이름마다 이 함수를 재귀호출

*/

static int dopath(Myfunc * func)

{

    struct stat statbuf;

    struct dirent *dirp;

    DIR *dp;

    int ret;

    char *ptr;


    if ( lstat(fullpath, &statbuf) < 0 )

        return(func(fullpath, &statbuf, FTW_NS));
    if ( S_ISDIR(statbuf.st_mode) == 0 )
        return(func(fullpath, &statbuf, FTW_F));


    /*
     디렉터리면 우선 그 디렉터리에 대해 func()를 호출하고
     그 디렉터리의 각 파일이름을 처리한다.
     */
    if (( ret = func(fullpath, &statbuf, FTW_D)) != 0 )
        return(ret);

    ptr = fullpath + strlen(fullpath);  /* fullpath의 끝을 가리킨다*/

    *ptr++ = '/';
    *ptr = 0;

    if (( dp = opendir(fullpath)) == NULL ) /* 디렉터리를 읽을 수 없음 */
        return(func(fullpath, &statbuf, FTW_DNR));

    while (( dirp = readdir(dp)) != NULL ) {
        if ( strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0 )
            continue;
        strcpy(ptr, dirp->d_name); /*슬러시 다음에 이름을 추가 */

        if ( ( ret = dopath(func)) != 0 )
            break;

    }
    ptr[-1] = 0; /*슬래시 이후의 모든 것을 삭제 */

    if ( closedir(dp) < 0 )
        err_ret("can't close directory %s", fullpath);

    return(ret);
}

static int myfunc(const char * pathname, const struct stat * statptr, int type)
{
    printf("myfunc pathname : %s\n", pathname);
    switch(type) {
        case FTW_F:
            switch(statptr->st_mode & S_IFMT) //S_IFMT : bit mask for the file type bit fields! 00170000
            {
                case S_IFREG :  nreg++;     break;
                case S_IFBLK :  nblk++;     break;
                case S_IFCHR :  nchr++;     break;
                case S_IFIFO :  nfifo++;    break;
                case S_IFLNK :  nslink++;   break;
                case S_IFSOCK:  nsock++;    break;
                case S_IFDIR:
                    err_dump("for S_IFDIR for %s", pathname);
            }
            break;
        case FTW_D:
            ndir++;
            break;
        case FTW_DNR:
            err_ret("can't read directory %s", pathname);
            break;
        case FTW_NS:
            err_ret("stat error for %s", pathname);
            break;
        default:
            err_dump("unknown type %d for pathname %s", type, pathname);
    }
    return (0);
}

결과

./4-22-2 test

fullpath: test

myfunc pathname : test

myfunc pathname : test/Makefile

myfunc pathname : test/a.h

myfunc pathname : test/a.c

myfunc pathname : test/b.c

myfunc pathname : test/a.o

myfunc pathname : test/test

myfunc pathname : test/abc

myfunc pathname : test/abc/def

regular files =       6, 66.67 %

directories =       3, 33.33 %

block special =       0,  0.00 %

char special =       0,  0.00 %

FIFOS files =       0,  0.00 %

symbolic links =       0,  0.00 %

sockets =       0,  0.00 %



여기서 궁금했던 점은 

ret = dopath(func)에서 fullpath를 넘기지 않는데 어떻게 갱신이 될까? 하는 점이었다.


하지만 이 내용을 보면 알 수 있다.


#전역변수로 fullpath 선언

static char * fullpath; /* 각파일의 전체 경로이름을 담음*/


탐색할 디렉토리가 

다음의 구조와 같다고 가정하면

test / abd

     /  de


1. ptr = fullpath + strlen(fullpath);  /* fullpath의 끝을 가리킨다*/

2. *ptr++ = '/';
    *ptr = 0;

3.  strcpy(ptr, dirp->d_name); /*슬러시 다음에 이름을 추가 */


4. while문 돌고 나서 strcpy(ptr, dirp->d_name); /*슬러시 다음에 이름을 추가 */




이런식이랄까?

ptr 변수의 위치는 while문을 도는 내내 고정되 있어서 같은 디렉터리 내의 파일 이름을

덮어쓰는 형식으로 구현되어 있었다.

fullpath는 전역변수이기에 dopath할때 func 함수포인터만 넘겨도 되었던 것이고!


신기하기도 했던 내용이라 기록으로 남겨둔다.

Posted by Triany
2014. 5. 9. 18:34

#include <string.h> // C++ 에서는 <cstring>

void * memset ( void * ptr, int value, size_t num );

 


메모리 블록을 채운다.
ptr 로 시작하는 메모리 주소 부터 num 개의 바이트를 value 값으로 채운다. 이 때, value 는 unsigned char 로 형변환 된다. 

 

ex)

int * arrs = (int *)malloc(sizeof(int) * 7 )

memset(arrs, 0, sizeof(int) * 7)

 

arrs배열에 동적할당하고, 0으로 초기화 한다!

Posted by Triany
2013. 4. 29. 16:37

* 실제로 포인터를 사용하는 경우들

  - 동적으로 할당된 메모리를 사용하는 경우 ( p = new listNode())

  - 함수의 매개 변수로 변수의 주소를 전달하는 경우

  - 클래스의 멤버변수나 멤버함수를 호출하는 경우

 

1. 동적 메모리와 정적메모리의 차이는?

< 정적 메모리 할당 >

  - 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당 받는 것

      -> 메모리의 크기가 프로그램이 시작하기 전에 결정

      -> 프로그램의 수행 도중에 그 크기는 변경될 수 없다.

 

int i, j;

int buf[80];

char name[] = "hello world";

장점 : 간단하게 메모리 할당

단점 :  입력의 크기를 미리알 수 없는 경우 -> 더 큰 입력이 들어온다면 처리 못함

                                                          -> 더 작은 입력이 들어온다면 남은 메모리 공간 낭비

 

< 동적 메모리 할당(dynamic memory allocation) >

- 실행 도중에 동적으로 메모리를 할당받는 것

- 필요한 만큼의 메모리를 시스템으로 할당(new)  받아서 사용이 끝나면 시스템에 메모리 반납(delete)

 

 

2. 동적 메모리 위치

 - 힙(heap)

 - 힙이란 ? : 코드공간/ 전역공간/ 스택을 제외하고 남은 메모리 영역

 - 힙 장점? : 히프 할당받으면 함수가 종료되더라도 메모리 공간이 없어지지 않음!

                  but!!! 히프에서 할당받은 공간은 반드시 반납하여야 한다. :)

                  => 반납하지 않고 계속 할당만 받으면 시스템이 정지할 수 있음!

* C++에서 메모리의 구분

# 코드공간(code space) : 코드 공간에는 프로그램 코드가 저장된다.

# 전역공간(global namespace) : 전역 공간에는 전역 변수들이 생성된다.

#스택(stack)

  - 스택은 프로그램이 실행하면서 사용하는 공간

  - 주로 함수 호출 시 함수 매개 변수 / 함수의 지역변수를 생성하는 공간

  - 함수호출 후 자동적 소멸

#힙(heap)

 

3. 동적 메모리 반납이 필요한 이유

  동적 할당된 메모리는 자동적으로 반납되지 않는다!

따라서 할당된 메모리를 가리키는 포인터를 항상 가지고 있다가 메모리가 더 이상 필요 없으면 delete를 사용하여 시스템에 반납하여야 한다!!

if, 동적 할당된 메모리를 반납하지 않고 포인터를 없애버리면 메모리를 반납할 방법이 없다.

-> 따라서 메모리를 프로그램이 종료되기 전까지 할당된 상태로 남아있다!

이상태를 ? 메모리 누수(memory leak)!

  ==> 반복적으로 메모리 누수가 일어나면 최종적으로 메모리 부족 현상초래!

 

 

 

 

출처 : POWER C++ / 천인국 저

 

 

 

Posted by Triany