'개발지식창고 > MFC' 카테고리의 다른 글
MFC 프로그램에서 메모리 릭 찾아내는 손쉬운 방법 (0) | 2010.08.22 |
---|---|
한글인지 아닌지 판단 (0) | 2010.08.22 |
CString 사용예제 (0) | 2010.08.17 |
CString 관련 함수 (0) | 2010.08.17 |
■ CFile 클래스 : 파일 입출력 클래스 (0) | 2010.07.30 |
MFC 프로그램에서 메모리 릭 찾아내는 손쉬운 방법 (0) | 2010.08.22 |
---|---|
한글인지 아닌지 판단 (0) | 2010.08.22 |
CString 사용예제 (0) | 2010.08.17 |
CString 관련 함수 (0) | 2010.08.17 |
■ CFile 클래스 : 파일 입출력 클래스 (0) | 2010.07.30 |
1. 문자열 복사 하기
단순히 대입만 하면 된다.
CString str1("어쩌구");
CString str2;
str2=str1; //대입
str2='A'; //단일문자
str2="ABC"; //문자열
2. 문자열 추출 하기
Left, Mid, Right 를 사용하여 추출한다. 직관적으로 왼쪽,중간,오른쪽이라는 것을 알 수 있다.
CString str1("ABCDE");
CString str2;
//왼쪽에서부터 i 개의 글자를 추출하여 Str2에 넣음
str2=str1.Left(i);
//오른쪽에서부터 i개의 글자를 추출하여 Str2에 넣음
str2=str1.Right(i);
//중간에 a번 건너뛰고 i개의 글자를 추출하여 Str2에 넣음
str2=str1.Mid(a,i);
EX)
str2=str1.Left(3);
printf("%s",str2); //"ABC"
str2=str1.Right(2);
printf("%s",str2); //"DE"
str2=str1.Mid(2);
printf("%s",str2); //"CDE"
str2=str1.Mid(2,2);
printf("%s",str2); //"CD"
3.문자열 연결하기
신기하게도 더하기 처럼 사용한다.
CString str;
str = "ab";
str = str + "c" + "d";
str += "e";
printf( str ); // "abcde"
4.문자열 비교하기
비교하여 정수를 리턴한다
CString str( "ABC" );
int bRet;
bRet = str.Compare( "ABC" );
// 0 , 같음 "ABC" == "ABC"
bRet = str.Compare( "abc" );
// -1 , 작음 "ABC" < "abc"
bRet = str.Compare( "123" );
// 1 , 큼 "ABC" > "123"
bRet = str.CompareNoCase( "abc" );
// 0 , 같음 "ABC" == "abc"
bRet = str.CompareNoCase( "ABC" );
// 0 , 같음 "ABC" == "ABC"
// oprator ==, !=, <, >, <=, >=
( str == "ABC" ) ? "true" : "false" // true
( str != "ABC" ) ? "true" : "false" // false
( str < "ABC" ) ? "true" : "false" // false
( str > "ABC" ) ? "true" : "false" // false
( str <= "ABC" ) ? "true" : "false" // true
( str >= "ABC" ) ? "true" : "false" // true
5.문자열 검색하기
찾을 문자열을 쓰면 성공/실패 리턴
int nIndex;
CString str("abcde abc");
nIndex = str.Find( 'a' );
// 0, 성공
nIndex = str.Find( 'k' );
// -1, 실패
nIndex = str.Find( "bc" );
// 1, 성공
nIndex = str.Find( "bcdef" );
// -1, 실패
nIndex = str.Find( "abc", 5 ); //5번째 이후부터 찾고, 찾은 위치 리턴
// 6, 성공
nIndex = str.ReverseFind( 'e' ); //뒤에서부터 찾아 위치 리턴
// 4, 성공
6. 문자세트 검색하기
과연 쓸모가 있을까 하는 기능
가장 비슷한 문자열을 찾아 준다고 하는데...
int nIndex;
CString str( "abcde abc" );
nIndex = str.FindOneOf( "1c23e" ); //이것같은 경우는 c를 찾아서 위치값리턴한다.
// 2, 성공
nIndex = str.FindOneOf( "123" ); //같은게 없으니까 당연히 실패
// -1, 실패
7. 문자세트 추출하기
추출이 진짜 추출이 아닌것같다. 문자열 걸러내기가 더 어울리는 것같은데...ㅎ
CString str( "age is 30 ~*^^*" );
CString spnstr;
// str은 변하지 않습니다.
// 소문자 a ~ z 그리고 공백 문자가 포함된 문자열까지 추출합니다.
spnstr = str.SpanIncluding( "abcdefghijklmnopqrstuvwxyz " );
// str 출력시 "age is 30 ~*^^*"
// spnstr 출력시 "age is "
// "~!@#$%^&*()-=_+[]{},.<>/?;:'`" 를 포함하지 않는 문자열까지 추출합니다.
spnstr = str.SpanExcluding(" ~!@#$%^&*()_=+[]{},.<>/?;:'`" " );
// str 출력시 "age is 30 ~*^^*"
// spnstr 출력시 "age is 30"
8. 문자열의 공백 및 문자 제거하기
제거하고 원래 문자열에 저장까지...이걸쓸껄...ㅋ
CString str1( " abcd \t\n" );
CString str2( "abcd1234" );
CString str3( "(***abcd1234***)" );
str1.TrimLeft(); //아무것도 안쓰면 공백 제거하기 왼쪽부터~
// "abcd \t\n"
str1.TrimRight(); //\t\n은 개행문자인데 따로 지정안해도 지워져버린다. 오른쪽~
// "abcd"
str2.TrimLeft( 'a' ); //특정문자 지정해서 지우기 왼쪽부터~
// "bcd1234"
str2.TrimRight( "234" ); //오른쪽부터~
// "bcd1"
str3.TrimLeft( "(*" ); //해봐야겠는데...
// "abcd1234***)"
str3.TrimRight( "*)" ); //왜 자동으로 **마저 지워지지?
// "abcd1234"
한글인지 아닌지 판단 (0) | 2010.08.22 |
---|---|
컨트롤의 색변환 (0) | 2010.08.22 |
CString 관련 함수 (0) | 2010.08.17 |
■ CFile 클래스 : 파일 입출력 클래스 (0) | 2010.07.30 |
WinMain.cpp를 MFC 클래스로 구현하면... (0) | 2010.07.30 |
[CString관련 함수]
함 수 |
기 능 |
Length |
문자열 길이 변환 |
Trim |
문자열 앞 뒤의 공백을 삭제 |
TrimLeft |
문자열의 왼쪽 공백을 삭제 |
TrimRight |
문자열의 오른쪽 공백을 삭제 |
UpperCase |
문자열 데이터를 대문자로 변환 |
LowerCase |
문자열 데이터를 소문자로 변환 |
StrReverse |
뒤바뀌어진 문자열을 반환 |
NumericText |
문자열이 숫자이면 True 값 반환 |
ToNumber |
문자열을 숫자로 변환 |
ToText |
숫자를 문자열로 변환 |
ToWords |
숫자를 단어로 변환 |
ReplicateString |
인수로 지정한 값만큼 반복 프린트 |
Space |
인수로 지정한 값만큼 공백문자 출력 |
Instr |
문자열에서 다른 문자열의 위치를 반환 |
InstrRev |
문자열에서 다른 문자열의 위치를 반대로 반환 |
StrCmp |
문자열을 비교해서 결과값을 반환 |
Mid |
문자열에서 지정한 만큼 문자열을 반환 |
Left |
문자열의 좌측으로부터 지정된 수의 문자를 반환 |
Right |
문자열의 우측으로부터 지정된 수의 문자를 반환 |
Val |
문자값을 수치로 변환 |
Chr |
아스키 값에 해당하는 문자 출력 |
Asc |
지정한 문자의 아스키 값을 반환 |
Filter |
|
Replace |
|
Join |
|
Split |
함 수 |
기 능 |
Length |
문자열 길이 변환 |
Trim |
문자열 앞 뒤의 공백을 삭제 |
TrimLeft |
문자열의 왼쪽 공백을 삭제 |
TrimRight |
문자열의 오른쪽 공백을 삭제 |
UpperCase |
문자열 데이터를 대문자로 변환 |
LowerCase |
문자열 데이터를 소문자로 변환 |
StrReverse |
뒤바뀌어진 문자열을 반환 |
NumericText |
문자열이 숫자이면 True 값 반환 |
ToNumber |
문자열을 숫자로 변환 |
ToText |
숫자를 문자열로 변환 |
ToWords |
숫자를 단어로 변환 |
ReplicateString |
인수로 지정한 값만큼 반복 프린트 |
Space |
인수로 지정한 값만큼 공백문자 출력 |
Instr |
문자열에서 다른 문자열의 위치를 반환 |
InstrRev |
문자열에서 다른 문자열의 위치를 반대로 반환 |
StrCmp |
문자열을 비교해서 결과값을 반환 |
Mid |
문자열에서 지정한 만큼 문자열을 반환 |
Left |
문자열의 좌측으로부터 지정된 수의 문자를 반환 |
Right |
문자열의 우측으로부터 지정된 수의 문자를 반환 |
Val |
문자값을 수치로 변환 |
Chr |
아스키 값에 해당하는 문자 출력 |
Asc |
지정한 문자의 아스키 값을 반환 |
Filter |
|
Replace |
|
Join |
|
Split |
함 수 |
기 능 |
Length |
문자열 길이 변환 |
Trim |
문자열 앞 뒤의 공백을 삭제 |
TrimLeft |
문자열의 왼쪽 공백을 삭제 |
TrimRight |
문자열의 오른쪽 공백을 삭제 |
UpperCase |
문자열 데이터를 대문자로 변환 |
LowerCase |
문자열 데이터를 소문자로 변환 |
StrReverse |
뒤바뀌어진 문자열을 반환 |
NumericText |
문자열이 숫자이면 True 값 반환 |
ToNumber |
문자열을 숫자로 변환 |
ToText |
숫자를 문자열로 변환 |
ToWords |
숫자를 단어로 변환 |
ReplicateString |
인수로 지정한 값만큼 반복 프린트 |
Space |
인수로 지정한 값만큼 공백문자 출력 |
Instr |
문자열에서 다른 문자열의 위치를 반환 |
InstrRev |
문자열에서 다른 문자열의 위치를 반대로 반환 |
StrCmp |
문자열을 비교해서 결과값을 반환 |
Mid |
문자열에서 지정한 만큼 문자열을 반환 |
Left |
문자열의 좌측으로부터 지정된 수의 문자를 반환 |
Right |
문자열의 우측으로부터 지정된 수의 문자를 반환 |
Val |
문자값을 수치로 변환 |
Chr |
아스키 값에 해당하는 문자 출력 |
Asc |
지정한 문자의 아스키 값을 반환 |
Filter |
|
Replace |
|
Join |
|
Split |
ex.CString a=Mid("miae",2) a=>ae
a=Mid("miae",2,1) a=>a
CString a= "ppp.html";
Mid(a.ReverseFind('.')+1) ==> html
Find()
int Find( TCHAR ch ) const;
찾을 문자열을 인자로 전달받아 찾은 문자열의 위치정보를 int형의 값으로 리턴합니다
CString str = "abcde";
int n = str.Find('c'); // 요 경우는 2를 리턴합니다(문자열의 첫위치는0)
없는 문자열 'z'를 찾고자 할때는 음수값 -1을 리턴합니다
ReverseFind(x)
int ReverseFind( TCHAR ch ) const;
뒤에서 ch 문자를 찾아서 그 자리를 넘긴다.
CString s( "abcabc" );
int a = s.ReverseFind('b') => a=4가 된다.
두번째 a를 찾고자 할때는 다음과 같이 정의할 수 있습니다.
n = str.Find('a', 3); // 3의 위치는 d가 되므로 d의 위치부터 탐색을 시작하게 됩니다.
n = str.Find('a', str.Find('a',) + 1);
=>명확히 알 수 없는 경우,
Length(x)
x는 텍스트 문자열이거나 텍스트 문자열을 가진 필드입니다.
동작
텍스트 문자열이나 문자 데이터 필드의 길이를 반환합니다. 텍스트 문자열의 길이에 의한 조작, 비교, 계산 등에 사용됩니다.
예제
다음 수식에서 Account 문자열의 개수인 7이 반환됩니다.
Length("Account") = 7
다음 수식은 {table.개수} 필드의 값이 14233.08일 때입니다. ToText 함수로 수치를 문자열로 바꾼 다음에 계산하게 됩니다.
Length(ToText({table.개수})) = 8
숫자를 문자로 변환시키는 ToText 함수는 쉼표(또는 천단위 구분자)를 텍스트로 변환하지 않습니다. 숫자 14233.08은 "14233.08"이라는 문자열로 변환되어 문자 길이는 8이 됩니다.
Length("SMITH") = 5
다음 수식에서 BOB와 SMITH 사이의 공백도 문자로 세어집니다.
Length("BOB SMITH") = 9
Trim(x)
x는 문자열입니다.
동작
Trim은 문자열 앞, 뒤의 공백을 제거합니다.
TrimLeft(x)
x는 문자열이거나 오른쪽으로 정렬되어 저장된 데이터 필드입니다.
동작
TrimLeft는 문자열이나 데이터베이스에 오른쪽으로 정렬된 문자열로 저장된 데이터 필드 왼쪽의 모든 공백을 제거합니다.
예제
텍스트 문자열의 정렬, 문자 횟수, 또는 계산(만일 문자열이 결국 숫자로 변환된다면)을 방해하는 선행 공백이 있을 때 이 함수를 사용합니다.
TrimLeft(" Al/4520/B12") = "A1/4520/B12"
TrimRight(x)
x는 문자열이거나 오른쪽으로 정렬되어 저장된 데이터 필드.
동작
TrimRight는 문자열이나 데이터베이스에 왼쪽으로 정렬된 문자열로 저장된 데이터 필드의 오른쪽의 모든 공백을 제거합니다.
예제
텍스트 문자열의 정렬, 문자 횟수, 또는 계산(만일 문자열이 결국 숫자로 변환된다면)을 방해하는 후 행 공백이 있을 때 이 함수를 사용합니다.
TrimRight("Al/4520/B12 ") = "A1/4520/B12"
TrimRight({table.Reference}) = "Bal Fwd."
UpperCase(x)
x는 대문자로 변환하길 원하는 텍스트 문자열입니다.
동작
UpperCase는 텍스트 문자열을 대문자로 바꾸어줍니다. 대문자와 소문자로 이루어진 문자열에서 모든 문자를 대문자로 변환할 수 있습니다.
예제
UpperCase("Description") = "DESCRIPTION"
UpperCase("abc12345") = "ABC12345"
UpperCase("mr " + "bUtler" ) = "MR BUTLER"
LowerCase(x)
x는 데이터 필드에 있는 텍스트 값이거나 텍스트 문자열입니다.
동작
LowerCase는 소문자로 문자 데이터 필드나 텍스트 문자열을 소문자로 변환합니다. 이 함수는 필드가 대문자와 소문자 둘 다 포함하고 있고 일관성을 위해 모든 값을 소문자로 변환하고자 할 때입니다. 문자열 안의 숫자는 LowerCase 함수에 의해 영향을 받지 않습니다.
예제
LowerCase("Description") = "description"
LowerCase("BrEaD " + "AND " + "bUtTeR") = "bread and butter"
StrReverse(InputString)
동작
예제
NumericText(x)
x는 텍스트로 저장된 숫자를 포함하고 있는지를 검사하고자 하는 텍스트 필드입니다.
동작
NumericText는 텍스트 필드의 내용이 숫자인지를 검사합니다.
만일 필드의 전체 내용이 숫자이거나 subscript 연산자를 통해 추출된 문자가 전부 숫자이면 식은 YES 값을 반환합니다. 만일 필드 내용이나 추출된 문자의 일부가 숫자가 아니면 식은 값 NO를 반환합니다.
예제
만일 숫자가 저장된 텍스트 필드를 ToNumber를 사용하여 변환하기에 적당한 지를 확인하기 위해 NumericText를 사용할 수 있습니다.
If NumericText({table.고객코드}) = YES Then
ToNumber{table.고객코드}
ToNumber(x)
x는 텍스트 문자열로 저장된 숫자입니다
동작
ToNumber는 텍스트 문자열을 숫자로 변환합니다.
데이터베이스에서 어떤 숫자는 수치 필드에 숫자로 저장되고 어떤 것은 문자 필드에 텍스트로 저장됩니다. 사용자는 처음 데이터베이스를 설정할 때 필드를 숫자로 할 것인지 텍스트로 할 것인지 결정합니다. 사용자가 계산을 수행하게 될 숫자(항목 단가, 주문한 수량 등)는 일반적으로 수치 필드에 저장되고 계산을 수행하지 않을 숫자(고객번호, 전화번호 등)는 일반적으로 텍스트 필드에 저장됩니다.
예제
ToNumber는 텍스트로 저장된 숫자를 계산에 사용할 수 있는 숫자로 변환하도록 해줍니다. 예를 들면, 만일 항목 번호가 코드화된 제품 정보를 가지고 있고, 계산에 그 정보를 사용하고 싶을 경우 이 함수를 사용할 수 있습니다.
ToNumber("123.45") = 123.45
{table.고객점수} 필드가 문자이고 값이 21385일 때 다음 수식은 True를 반환합니다.
ToNumber({table.고객점수}) < 33333 = TRUE
ToText(x) / ToText(x, #places)
x는 텍스트로 변환되고자 하는 숫자이며 #places는 소수자리의 수를 지정하는 숫자입니다.
동작
ToText는 숫자를 텍스트 문자열로 변환합니다.
텍스트 문자열(폼 문자, 리포트의 주석, 플래그 등)에서 사용될 수 있도록 수치 필드값이나 숫자 계산의 결과를 텍스트로 변환하기 위해 이 함수를 사용할 수 있습니다.
ToText(x, # places)는 숫자를 텍스트 문자열로 변환하고 텍스트로 쓰여질 때 숫자의 소수자리의 수를 지정하도록 해줍니다.
예제
ToText(123.45) = "123.45"
ToText(12345.6749,2) = "12345.67"
ToText(12345.6750,2) = "12345.68"
ToText(12345.5000,0) = "12346"
ToWords(x) / ToWords(x, n)
x는 단어로 변환하고자 하는 숫자입니다. (1 = one, 68 = sixtyeight 등)
n은 결과의 포함된 소수자리의 수입니다.
동작
사용자는 텍스트로 사용될 수 있도록 숫자, 통화 필드값이나 숫자 계산의 결과를 단어로 변환하는데 이 함수를 사용합니다.
음수는 단어 "negative"로 시작합니다.
예제
ToWords(12345) = twelve thousand three hundred fortyfive and xx/100
ToWords(12345,0) = twelve thousand three hundred fortyfive
ToWords(12.3499) = twelve and 35/100
☞ 통화 필드값과 수치 필드값은 같은 방식으로 취급되고 동일한 결과를 산출합니다.
☞ 철자로 표현된 값이 숫자 값보다 훨씬 길기 때문에 새로운 필드 길이를 수용하기 위해 사용자는 필드 상자의 길이를 증가시킬 필요가 있습니다.
ReplicateString(x, n)
x는 문자열이고 n은 정수입니다.
동작
문자열 x를 n번 인쇄합니다. 간단한 막대 그래프를 *를 사용해서 작성하는 경우와 같이 문자열을 삽입하기 위해 이 함수를 사용합니다.
예제
조건에 맞으면 문자 "*" 를 10번 인쇄하는 수식은 다음과 같습니다.
If {table.목표액} < {table.실적} Then
ReplicateString("*",10)
Else
""
다음 수식은 고객점수 결과를 보여주는 막대 그래프를 인쇄합니다. 즉, 수식은 고객 점수 필드에 대해 별표를 인쇄합니다.
{table.고객이름}+ " " + ReplicateString("*", {table.고객점수})
Space(length)
length는 정수입니다.
동작
지정된 수의 공백으로 구성된 값을 반환합니다.
예제
다음 수식은 " "를 반환합니다.
Space(2)
InStr (str1, str2), InStr (start, str1, str2)
str1, str2는 문자열이고, start는 수치입니다.
동작
다른 문자열에서의 위치를 알려 줍니다. 위치를 지정하지 않으면 1이 지정된 것으로 동작됩니다. 만일 0이 반환되면 발견되지 않은 것입니다.
예제
다음 수식에서 2가 반환됩니다.
InStr("abcdefg", "bcd")
InStrRev(InputString)
동작
예제
StrCmp(str1, str2), StrCmp(str1, str2, compare)
str1, str2는 문자열이고 compare는 정수입니다.
동작
문자열 비교의 결과를 의미하는 값을 반환합니다.
str1이 str2 보다 적으면 -1
str1이str2와 같으면 0
str1이str2보다 크면 1
string1 또는 string2 이 Null이면 Null
예제
다음 수식은 1을 반환합니다.
StrCmp("abcd", "aa")
다음 수식은 -1을 반환합니다.
StrCmp ("abcd", "ac")
다음 수식은 0을 반환합니다.
StrCmp ("aa", "aa")
Mid(str, start), Mid(str, start, length)
str은 문자열, start와 length는 수치입니다.
동작
Mid 함수는 한 문자열에서 지정된 수의 문자들을 반환합니다.
예제
다음 수식은 "cd"를 반환합니다.
Mid("abcdef", 3, 2)
Left(str, length)
x는 텍스트 문자열입니다.
동작
지정한 수만큼 문자열의 앞 부분을 반환합니다.
예제
다음 수식에서 "abcd"가 반환됩니다.
Left("abcdefg", 4)
->)Mid()
CString Mid( int nFirst ) const;
throw( CMemoryException );
CString Mid( int nFirst, int nCount ) const;
throw( CMemoryException );
(예제)
CString stra ="aaaa<bcd>eeeeeeeeee"ff"g";
int nPoint=0, nNextPoint=0;
nPoint=stra.Find("<", nPoint); //0 처음부터 < 있는걸 찾아서 그 자리 값을 nPoint에
stra.Mid(nPoint, 3); =><이후부터 3자리 찾으면, bcd 가 되겠졍~
Right(str, length)
str은 문자열이고 length는 정수입니다.
동작
문자열의 우측으로부터 지정된 수의 문자를 반환합니다.
예제
다음 수식은 "efg"를 반환합니다.
Right("abcdefg", 3)
Val(x)
x는 문자열입니다.
동작
Val 함수는 문자열을 수치로 바꾸어줍니다.
예제
다음 수식은 2234100을 반환합니다.
Val("2234 100th Street")
Chr(x)
x는 수치입니다.
동작
Asc 함수의 반대 동작을 합니다. 즉, 수치에 해당하는 문자를 반환합니다.
예제
다음 수식에서 아스키 값 65에 해당하는 A가 반환됩니다.
Chr(65)
ASC(x)
x는 텍스트 문자나 문자열입니다.
동작
텍스트 문자나 문자 데이터 필드의 첫 문자의 아스키 값을 반환합니다.
예제
다음 수식에서 문자 A의 아스키 값인 65가 반환됩니다.
Asc("A") = 65
컨트롤의 색변환 (0) | 2010.08.22 |
---|---|
CString 사용예제 (0) | 2010.08.17 |
■ CFile 클래스 : 파일 입출력 클래스 (0) | 2010.07.30 |
WinMain.cpp를 MFC 클래스로 구현하면... (0) | 2010.07.30 |
MFC 내부에 감추어진 것들 (0) | 2010.07.30 |
■ 파일 열고 닫기 함수 : Open()과 Close()
CFile file ; file.Open(_T("File.txt"), CFile::modeCreate| CFile::modeWrite ) ; // ... 파일에 데이터를 읽거나 쓰는 작업 수행 file.Close() ; |
。Open 함수의 매개 변수
- 첫번째 arg : 파일명
- 두번째 arg : 파일 접근 모드와 공유모드 정의. OR(|) 연산자를 이용하여 여러 개 조합.
- 기존에 이 파일이 없으면 새로운 파일이 생성되고 있으면 기존 파일의 맨 뒤에 새로 쓰는 데이터를 덧붙인다.
。 파일 접근 모드
접근 모드 | 설명 |
CFile::modeRead | 파일 읽기만 가능 |
CFile::modeWrite | 파일 쓰기만 가능 |
CFile::modeReadWrite | 파일 읽고 쓰기 모두가능 |
CFile::modeCreate | 파일 새로 생성 |
CFile:modeNoTruncate | 기존에 파일 데이터가 존재 시 맨 뒤에 추가하지 않고 덮어쓴다. |
。파일 공유 모드
공유 모드 | 설명 |
CFile::shareDenyNone | 공유하도록 파일 열기 |
CFile::shareDenyRead | 다른 프로그램의 읽기 접근 거부 |
CFile::shareDenyWrite | 다른 프로그램의 쓰기 접근 거부 |
CFile::shareExclusive | 다른 프로그램의 읽기, 쓰기 모두 거부 |
■ 파일 데이터 쓰기 함수 : Write()
- 우선 파일을 '쓰기 모드'로 연다.
int buffer[1000] ; CFile file ; file.Open( _T("File.dat", CFile::modeCreate | CFile::modeWrite ) ; file.Write( buffer, 1000 * sizeof(int) ) ; file.Close() ; |
。Write 함수의 매개 변수
- 첫번째 arg : 파일에 쓰고자 하는 데이터가 저장된 메모리 포인터를 넘겨준다.
- 두번째 arg : 데이터의 크기를 바이트 단위로 넘겨준다.
■ 파일 데이터 읽기 함수 : Read()
- 우선 파일을 '읽기 모드'로 파일을 연다.
int buffer[1000] ; CFile file ; file.Open( _T("File.dat"), CFile::modeRead ) ; file.Read( buffer, 1000 * sizeof(int) ) ; file.Close() ; |
。Read 함수의 맴개 변수
- 첫번째 arg : 읽은 데이터를 저장할 메모리의 포인터를 넘겨 준다.
- 두번째 arg : 읽고자 하는 데이터의 크기를 바이트 단위로 넘 겨준다.
■ 파일의 길이를 알아내는 함수 : GetLength()
- 파일의 크기를 알아내고 그 크기만큼 데이터를 읽어 온다.
CFile file ; file.Open( _T("File.dat"), CFile::modeRead ) ; int nLength = file.GetLength() ; int *buffer = new BYTE [nLength] ; file.Read( buffer, nLength ) ; file.Close() ; |
■ 에러 처리 : TRY ~ CATCH 블록
- TRY 블록 안의 루틴을 수행하다가 실행 중 에러가 발생할 경우에만 CATCH 블록이 실행된다.
- CFileException 함수의 ReportError 함수를 호출한다.
- ReportError 함수는 사용자에게 어떤 에러가 발생했는지 알려주는 메세지 박스를 출력해 준다.
TRY { int buffer[1000] ; CFile file ; file.Open( _T("File.dat"), CFile::modeCreate | CFile::modeWrite ) ; file.Write( buffer, 1000 * sizeof(int) ) ; file.Close() ; } CATCH(CFileException e ) { e->ReportError() ; } END_CATCH |
■ 파일 포인터
。현재 파일 포인터 위치 얻기 : GetPosition
- [TBD]
。파일 포인터 옮기기 : Seek
file.Seek( 1000, CFile::current ) ; file.Read( buffer1, sizeof(int) * 10 ) ; file.Seek( -2000, CFile::end ) ; flie.Read( buffer2, sizeof(int) * 10 ) ; |
- Seek 함수의 매개변수
첫번째 arg : 이동 거리
두번째 arg : 이동 시 파일 포인터 기준 위치
- 파일 포인터의 기준
매개변수 | 설명 |
CFile::begin | 기준은 파일의 처음 위치 |
CFile::current | 기준은 현재 파일 포인터의 위치 |
CFile::end | 기준은 파일의 끝 위치 |
■ 그 밖에 파일 처리 (기타 멤버 함수)
GetFilePath : 파일의 전체 경로명 반환
GetFileName : 파일 이름 반환
GetFileTitle : 확장자를 제외한 파일 이름 반환
GetStatus : 파일이 생성된 시간, 최종 변경된 시간, 크기, 속성 등 파일의 상태 얻기
SetStatus : 파일의 상태를 지정
Remove : 파일 지우기
Rename : 파일 이름 변경
CString 사용예제 (0) | 2010.08.17 |
---|---|
CString 관련 함수 (0) | 2010.08.17 |
WinMain.cpp를 MFC 클래스로 구현하면... (0) | 2010.07.30 |
MFC 내부에 감추어진 것들 (0) | 2010.07.30 |
다중 도큐먼트 ( MDI : Multiple Document Interface ) (0) | 2010.07.30 |
헤더파일 stdafx.h를 열어 "#include <afxwin.h>"를 추가해준다. |
CString 관련 함수 (0) | 2010.08.17 |
---|---|
■ CFile 클래스 : 파일 입출력 클래스 (0) | 2010.07.30 |
MFC 내부에 감추어진 것들 (0) | 2010.07.30 |
다중 도큐먼트 ( MDI : Multiple Document Interface ) (0) | 2010.07.30 |
RTTI 사용을 위한 CRuntimeClass와 매크로들 (0) | 2010.07.30 |
■ SDK와 MFC
- SDK에서 제공하는 모든 기능이 다 MFC에 캡슐화 되어 있는 것은 아니라는 점에서 주의하라.
- 굳이 클래스 형태로 캡슐화 할 필요가 없는 기능들도 많이 있는데 MFC에서는 이런 함수들을 굳이 클래스로 만들지 않고, 그냥 SDK 형태로 사용하도록 두었다.
- 예를들어 GlobalAlloc 처럼 메모리를 할당하는 일은 특정 클래스에서만 하는 것이 아니라 언제, 어디서든 사용할 수 있는 기능이기 때문에 그냥 SDK 함수 형태로 사용한다.
■ WinMain 은 어디에?
- MFC는 어떠한 프로그램을 작성하더라도 WinMain 함수를 건드리지 않고 작성할 수 있도록 모든 것을 완벽하게 처리해 놓았다.
- MFC 내부에 들어 있는 WinMain 함수를 간략히 보면 다음과 같다.
int APIENTRY WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { CWinApp *pApp = AfxGetApp() ; pApp->InitApplication() ; pApp->InitInstance() ; pApp->Run() ; pApp->ExitInstance() ; } |
InitApplication 함수는 프로그램 초기화 기능을 수행하고, InitInstance 함수는 보통 재정의되는 함수로 도큐먼트 뷰를 등록하고, 메인 프레임 윈도우를 생성하는 일을 수행한다. Run 함수는 WM_QUIT 메세지를 만날 때까지 무한 루프를 돌면서 메세지를 윈도우 프로시저에 전달하는 기능을 한다.
■ CFile 클래스 : 파일 입출력 클래스 (0) | 2010.07.30 |
---|---|
WinMain.cpp를 MFC 클래스로 구현하면... (0) | 2010.07.30 |
다중 도큐먼트 ( MDI : Multiple Document Interface ) (0) | 2010.07.30 |
RTTI 사용을 위한 CRuntimeClass와 매크로들 (0) | 2010.07.30 |
컴파일 시 Release 모드와 Debug 모드의 차이 (0) | 2010.07.30 |
■ 도큐먼트의 종류
도큐먼트 | 설명 |
단일 도큐먼트 ( SDI : Single Document Interface ) |
한번에 하나의 도큐먼트만 처리할 수 있기 때문에 프로그램의 프레임 윈도우가 하나이다. 메인 프레임 윈도우가 도큐먼트, 뷰를 품고 있다. |
다중 도큐먼트 ( MDI : Multiple Document Interface ) |
하나의 프로그램에서 여러 개의 문서를 동시에 작업할 때 사용하며 프로그램의 프레임 윈도우가 여러 개이다. 자식 프레임 윈도우가 도큐먼트, 뷰를 품고 있다. |
■ 단일 도큐먼트
하나의 프레임 윈도우에 대해 CFrameWnd 클래스에서 파생된 하나의 클래스만 갖는다.
메인 프레임이 윈도우에서 도큐먼트 뷰를 품고 있기 때문에 따로 윈도우를 생성하지 않아도 된다.
■ 다중 도큐먼트
。다중 프레임 윈도우의 계층 구조
CWnd
CFrameWnd
CMDIFrameWnd
CMDIChildWnd
。두 종류의 프레임 윈도우가 있다.
메인 프레임 윈도우 : 프로그램 전체를 둘러싸고 있다. CMDIFrameWnd 클래스
자식 프레임 윈도우 : 메인 프레임 윈도우 안쪽의 작은 프레임 윈도우로 뷰 윈도우를 품고
있다. CMDIChildWnd 클래스.
WinMain.cpp를 MFC 클래스로 구현하면... (0) | 2010.07.30 |
---|---|
MFC 내부에 감추어진 것들 (0) | 2010.07.30 |
RTTI 사용을 위한 CRuntimeClass와 매크로들 (0) | 2010.07.30 |
컴파일 시 Release 모드와 Debug 모드의 차이 (0) | 2010.07.30 |
CScrollView (분할 윈도우에 주로 사용되는 클래스 특징) (0) | 2010.07.29 |
■ RTTI (Run-Time Type Information)
- C++에서는 RTTI를 완벽하게 지원하지 않는다. 때문에 MS는 Compiler 차원에서 RTTI를 지원해 주기 위한 방법을 구현해낸 것이 CRuntimeClass와 여러가지 매크로 함수를 제공하고 있다.
■ CRuntimeClass
- 본질적으로 특정 클래스에 대한 정보를 담고 있는 구조체이다.
- 일반화된 객체 생성 : 클래스 이름을 사용하지 않고 객체를 생성하는 기능
기반 클래스를 가지고 있지 않다.
- 세 종류의 매크로를 제공한다.
DECLARE_DYNCREATE()
IMPLEMENT_DYNCREATE()
RUNTIME_CLASS()
■ IMPLEMENT_DYNCREATE(CSimpleCalc, CCmdTarget)
- 첫번째 변수는 동적으로 생성하고자 하는 객체 클래스 이름
- 두번째 변수는 그 클래스가 상속 받는 기반 클래스의 이름
ex) 메인 프레임의 경우, 기반 클래스가 CFrameWnd 이면 단일 도큐먼트(SDI), CMDIFrameWnd 이면 다중 도큐먼트(MDI) 형식이다.
■ RUNTIME_CLASS 매크로
- class 정보를 구하는 매크로
- 주로 현재 사용하는 클래스가 유효한 클래스인지 판단
MFC 내부에 감추어진 것들 (0) | 2010.07.30 |
---|---|
다중 도큐먼트 ( MDI : Multiple Document Interface ) (0) | 2010.07.30 |
컴파일 시 Release 모드와 Debug 모드의 차이 (0) | 2010.07.30 |
CScrollView (분할 윈도우에 주로 사용되는 클래스 특징) (0) | 2010.07.29 |
현재모듈 실행 경로 얻어오기 (0) | 2010.07.28 |
■ 디버그 모드 컴파일
디버깅을 할 수 있는 대신 실행 파일의 크기가 커지고, 실행 속도도 느려진다.
■ 릴리즈 모드 컴파일
디버깅을 할 수 없지만 실행 파일의 크기도 작아지고 실행 속도도 빨라진다.
디버깅 정보를 실행 코드 안에 넣느냐 안 넣느냐의 차이이다.
따라서 디버그 모드로 개발하고 개발이 완료되고 난 후에는 릴리즈 모드로 컴파일해서 배포한다.
다중 도큐먼트 ( MDI : Multiple Document Interface ) (0) | 2010.07.30 |
---|---|
RTTI 사용을 위한 CRuntimeClass와 매크로들 (0) | 2010.07.30 |
CScrollView (분할 윈도우에 주로 사용되는 클래스 특징) (0) | 2010.07.29 |
현재모듈 실행 경로 얻어오기 (0) | 2010.07.28 |
윈도우 최상위 윈도우로 끌어 올리기 (0) | 2010.07.28 |
스크롤이 이동될때 내부적으로 자동으로 해주므로
void CWebDlgFormView::OnMouseMove(UINT nFlags, CPoint point)
{
//Invalidate();
}
위 과정은 생력해도 된다
RTTI 사용을 위한 CRuntimeClass와 매크로들 (0) | 2010.07.30 |
---|---|
컴파일 시 Release 모드와 Debug 모드의 차이 (0) | 2010.07.30 |
현재모듈 실행 경로 얻어오기 (0) | 2010.07.28 |
윈도우 최상위 윈도우로 끌어 올리기 (0) | 2010.07.28 |
HTML 문자열(ANSI,UTF-8 등) 인코딩 체크함수 (0) | 2010.07.28 |