[MFC] 폴더 생성 및 파일 생성[MFC] 폴더 생성 및 파일 생성
Posted at 2009. 1. 1. 02:59 | Posted in 프로그래밍 언어/C/C++/MFC1. 폴더 생성
첫번째 인자는 만들 디렉토리 이름, 두 번째 인자는 security 설정인데 패스;
CreateDirectory 함수는 MFC로 프로젝트를 만들면 기본적으로 사용할 수 있는 함수이다.
main/sub 식으로 만들기 위해선 main 디렉토리를 만든 이후 main/sub 디렉토리를 만들어야 한다.
만약 아무 디렉토리도 없는 상태에서 main/sub/subsub 를 만들고자 한다면 다음과 같이 할 수 있다.
CreateFolder(_T("main/sub/subsub"));식으로 호출하면 된다.
while 문에서 / 단위로 끊어 읽으면서 디렉토리를 생성한다.
while 문 안에서 main, main/sub 디렉토리가 생성되며
while 문 밖에서 main/sub/subsub 디렉토리가 생성된다.
여기서 무작정 CreateDirectory를 호출하지 않고 csToken 값에 . 이 있는지를 검사한다.
. 이 포함되어 있다면 파일이므로 CreateDirectory가 아닌 CFile 등의 방법으로 파일을 만들도록 코드를 수정하면
CreateFolder(_T("main/sub/subsub.cpp"));식으로도 사용할 수 있을 것이다
아래 박스 코드를 위 코드의 CreateDirectory(...) 대신 쓰면 된다.
물론, 폴더 이름에 . 을 넣거나 하면 낭패다-_-;
2. 파일 생성
파일이 존재하지 않으면 기본적인 내용을 추가하여 파일을 생성하고, 존재하면 건너뛰는 코드이다.
사실, 파일이 존재하면 그 파일 내용을 지우지 않고 여는 방법은 단순하다.
하지만 파일이 존재하면 아무 일도 하지 않고,
파일이 존재하지 않을 때 파일을 생성 및 기본적인 내용을 추가하려 한다면
modeNoTruncate 로 여는 것으론 해결할 수 없다.
예 >> a.cpp 파일을 생성하는데 파일이 없으면 int main(){ return 0; } 을 넣어 생성하고,
>> 파일이 있다면 아무 일도 수행하지 않으려 하는 경우.
>> 기껏 a.cpp 코딩 다 해 놨는데 이 파일을 위와 같은 초기화 파일로 만들면 슬퍼지니까;;;
CreateDirectory(_T("main"), NULL);
CreateDirectory(_T("main/sub1"), NULL);
CreateDirectory(_T("main/sub1"), NULL);
첫번째 인자는 만들 디렉토리 이름, 두 번째 인자는 security 설정인데 패스;
CreateDirectory 함수는 MFC로 프로젝트를 만들면 기본적으로 사용할 수 있는 함수이다.
main/sub 식으로 만들기 위해선 main 디렉토리를 만든 이후 main/sub 디렉토리를 만들어야 한다.
만약 아무 디렉토리도 없는 상태에서 main/sub/subsub 를 만들고자 한다면 다음과 같이 할 수 있다.
void CreateFolder(CString csPath)
{
// UpdateData(TRUE);
// csPath = m_csTopFolderName + csPath;
CString csPrefix(_T("")), csToken(_T(""));
int nStart = 0, nEnd;
while( (nEnd = csPath.Find('/', nStart)) >= 0)
{
CString csToken = csPath.Mid(nStart, nEnd-nStart);
CreateDirectory(csPrefix + csToken, NULL);
csPrefix += csToken;
csPrefix += _T("/");
nStart = nEnd+1;
}
csToken = csPath.Mid(nStart);
CreateDirectory(csPrefix + csToken, NULL);
}
{
// UpdateData(TRUE);
// csPath = m_csTopFolderName + csPath;
CString csPrefix(_T("")), csToken(_T(""));
int nStart = 0, nEnd;
while( (nEnd = csPath.Find('/', nStart)) >= 0)
{
CString csToken = csPath.Mid(nStart, nEnd-nStart);
CreateDirectory(csPrefix + csToken, NULL);
csPrefix += csToken;
csPrefix += _T("/");
nStart = nEnd+1;
}
csToken = csPath.Mid(nStart);
CreateDirectory(csPrefix + csToken, NULL);
}
CreateFolder(_T("main/sub/subsub"));식으로 호출하면 된다.
while 문에서 / 단위로 끊어 읽으면서 디렉토리를 생성한다.
while 문 안에서 main, main/sub 디렉토리가 생성되며
while 문 밖에서 main/sub/subsub 디렉토리가 생성된다.
여기서 무작정 CreateDirectory를 호출하지 않고 csToken 값에 . 이 있는지를 검사한다.
. 이 포함되어 있다면 파일이므로 CreateDirectory가 아닌 CFile 등의 방법으로 파일을 만들도록 코드를 수정하면
CreateFolder(_T("main/sub/subsub.cpp"));식으로도 사용할 수 있을 것이다
아래 박스 코드를 위 코드의 CreateDirectory(...) 대신 쓰면 된다.
if(csToken.Find('.') >= 0)
CreateFile(csToken, csPrefix);
else
CreateDirectory(csPrefix + csToken, NULL);
CreateFile(csToken, csPrefix);
else
CreateDirectory(csPrefix + csToken, NULL);
물론, 폴더 이름에 . 을 넣거나 하면 낭패다-_-;
2. 파일 생성
파일이 존재하지 않으면 기본적인 내용을 추가하여 파일을 생성하고, 존재하면 건너뛰는 코드이다.
void CreateFile(CString csFileName, CString csPrefix)
{
CFile file;
if(!file.Open(csPrefix + csFileName, CFile::modeRead))
{
file.Open(csPrefix + csFileName, CFile::modeCreate|CFile::modeWrite);
file.Write(~~~~);
}
file.Close();
}
{
CFile file;
if(!file.Open(csPrefix + csFileName, CFile::modeRead))
{
file.Open(csPrefix + csFileName, CFile::modeCreate|CFile::modeWrite);
file.Write(~~~~);
}
file.Close();
}
사실, 파일이 존재하면 그 파일 내용을 지우지 않고 여는 방법은 단순하다.
CFile file(_T("main.cpp"), CFile::modeCreate|CFile::modeNoTruncate);
하지만 파일이 존재하면 아무 일도 하지 않고,
파일이 존재하지 않을 때 파일을 생성 및 기본적인 내용을 추가하려 한다면
modeNoTruncate 로 여는 것으론 해결할 수 없다.
예 >> a.cpp 파일을 생성하는데 파일이 없으면 int main(){ return 0; } 을 넣어 생성하고,
>> 파일이 있다면 아무 일도 수행하지 않으려 하는 경우.
>> 기껏 a.cpp 코딩 다 해 놨는데 이 파일을 위와 같은 초기화 파일로 만들면 슬퍼지니까;;;
2009년은 기축년 (己丑年)2009년은 기축년 (己丑年)
Posted at 2009. 1. 1. 01:00 | Posted in 이야기 방/일상 이야기다사다난했던 2008년이 끝이 났다.
2009년은 어떤 해가 될까?
나에게 있어, 모두에게 있어 좋은 해가 될 수도, 안 좋은 해가 될 수도 있겠지.
지나기 전까지는 알 수 없는 일이지만,
2009년 한 해는 내 자신 스스로가 만족할 만한 해였으면 한다.
모두들, 무엇보다, 건강하길.
Google Code Jam을 하기 위한 기반 클래스Google Code Jam을 하기 위한 기반 클래스
Posted at 2008. 12. 27. 16:39 | Posted in 프로그래밍 언어/Ruby일단 Google Code Jam은 인풋파일의 형태가 보통
[처리해야 할 인풋 개수]
[인풋 1]
[인풋 2]
...
이런 식이고 출력형태는
Case #1: [값]
Case #2: [값]
...
이런 식이다.
어떤 문제를 풀던간에 파일 처리는 기본적으로 해야 하는 부분이기 때문에
이 부분을 처리해 주는 클래스를 하나 만들었다.
file_reader.rb
아래는 제대로 문제를 푼 것이 아니다;;
Round1A_numbers.rb
process_per_line 메서드를 호출하면 @algorithm 에 구현된? 메서드의 블록으로 파일의 each line을 파라미터로 넘긴다.
즉 FileReader.new 뒤의 블록에 파일 한 줄을 읽어 문제를 처리하는 알고리즘을 구현하면 된다.
그리고 블록의 마지막에 결과를 위치시킨다.
저런 FileReader.new do - end 가 FileReader의 initialize(&algorithm) 의 algorithm으로 넘겨져 쓰이는 것을
뭐라고 부르는 지는 잘 모르겠다.
이게 closure인가-_-?;;
루비는 시작한지 며칠 안 돼서 루비의 특징을 살린 코드라고는 절대 할 수 없는 코드지만;
C++에서는 경험하지 못했던 것들이라 언어 자체가 흥미롭고 재밌다.
[처리해야 할 인풋 개수]
[인풋 1]
[인풋 2]
...
이런 식이고 출력형태는
Case #1: [값]
Case #2: [값]
...
이런 식이다.
어떤 문제를 풀던간에 파일 처리는 기본적으로 해야 하는 부분이기 때문에
이 부분을 처리해 주는 클래스를 하나 만들었다.
file_reader.rb
그리고 문제를 풀 파일을 하나 생성하여 다음과 같이 위 클래스를 사용한다.class FileReader
def initialize(&algorithm)
@fin = File.open("input/" + $0.split(".")[0] + ".txt")
@fout = File.new("input/" + $0.split(".")[0] + "_out.txt", "w")
@num_of_inputs = @fin.gets # read value meaning # of inputs
@algorithm = algorithm
end
def process_per_line
line_cnt = 1
@fin.each_line do |line|
result = @algorithm.call(line)
@fout.print "Case ##{line_cnt}: #{result}\n"
print "Case ##{line_cnt}: #{result}\n"
line_cnt += 1
end
end
def destroy
@fin.close
@fout.close
end
end
인풋, 아웃풋 파일 이름은 이 클래스가 사용되는 파일 이름을 사용한다.
예를 들어 이 클래스가 test.rb 에 include/require로 불려진다면 input/output file은
input/test.txt, input/test_out.txt 가 될 것이다.
아래는 제대로 문제를 푼 것이 아니다;;
Round1A_numbers.rb
FileReader.new 뒤의 do-end 블록이 FileReader 클래스의 @algorithm이 되고,require 'file_reader.rb'
file_reader = FileReader.new do |line|
inner_val = (3 + Math.sqrt(5))**line.to_i
inner_val = inner_val.floor % 1000
result = ""
case inner_val
when (0..9)
result += "00"
when (10..99)
result += "0"
end
result + inner_val.to_s
end
file_reader.process_per_line
file_reader.destroy
process_per_line 메서드를 호출하면 @algorithm 에 구현된? 메서드의 블록으로 파일의 each line을 파라미터로 넘긴다.
즉 FileReader.new 뒤의 블록에 파일 한 줄을 읽어 문제를 처리하는 알고리즘을 구현하면 된다.
그리고 블록의 마지막에 결과를 위치시킨다.
저런 FileReader.new do - end 가 FileReader의 initialize(&algorithm) 의 algorithm으로 넘겨져 쓰이는 것을
뭐라고 부르는 지는 잘 모르겠다.
이게 closure인가-_-?;;
루비는 시작한지 며칠 안 돼서 루비의 특징을 살린 코드라고는 절대 할 수 없는 코드지만;
C++에서는 경험하지 못했던 것들이라 언어 자체가 흥미롭고 재밌다.
왜 자바스크립트의 String에는 trim이 없는가!!왜 자바스크립트의 String에는 trim이 없는가!!
Posted at 2008. 12. 25. 17:12 | Posted in 프로그래밍 언어/Javascript왜 없지-_-;
String에 trim 함수를 추가해 주자;
앞의 replace가 left-trim이고 뒤의 replace가 right-trim이다.
white space로 시작하는 문자열이면 그 white space를 ""로 치환,
white space로 끝나는 문자열이면 그 white space를 "'로 치환.
String에 trim 함수를 추가해 주자;
String.prototype.trim = function()
{
return this.replace(/^\s+/, '').replace(/\s+$/, '');
}
{
return this.replace(/^\s+/, '').replace(/\s+$/, '');
}
앞의 replace가 left-trim이고 뒤의 replace가 right-trim이다.
white space로 시작하는 문자열이면 그 white space를 ""로 치환,
white space로 끝나는 문자열이면 그 white space를 "'로 치환.
C99에서 정의한 변수 선언, 동적배열C99에서 정의한 변수 선언, 동적배열
Posted at 2008. 12. 24. 18:27 | Posted in 프로그래밍 언어/C/C++/MFC소스코드는 다음과 같다.
소스코드가 어려운 건 아니니까 출력결과는 넘어간다.
중요 포인트는
1. 소스 중간에 변수를 선언할 수 있다는 것. ( line 8,10 )
2. 배열 선언 시 그 크기를 변수로 지정해 줄 수 있다는 것 ( line 8 )
툴을 VS6을 써서 C를 배웠다면 저런 건 안 된다고 배웠겠지만;
99년 지정된 표준에서는 됨니다.
근데 VS2005랑 2008에서는 왜 안될까?
에러를 보면 위에 중요 포인트라고 짚은 것 때문에 안 되는 것이다.
컴파일러 옵션에서 뭘 설정해 줘야 할지도 모르겠다.
gcc에선 위의 코드가 잘 돌아간다.
1 #include <stdio.h>
2
3 int main()
4 {
5 int size;
6 printf("숫자입력 : ");
7 scanf("%d", &size);
8 int arr[size];
9 printf("출력해염\n");
10 int i=0;
11 for(i=0; i<size; i++)
12 arr[i] = i;
13 for(i=0; i<size; i++)
14 printf("%d->%d\n", i, arr[i]);
15 return 0;
16 }
2
3 int main()
4 {
5 int size;
6 printf("숫자입력 : ");
7 scanf("%d", &size);
8 int arr[size];
9 printf("출력해염\n");
10 int i=0;
11 for(i=0; i<size; i++)
12 arr[i] = i;
13 for(i=0; i<size; i++)
14 printf("%d->%d\n", i, arr[i]);
15 return 0;
16 }
소스코드가 어려운 건 아니니까 출력결과는 넘어간다.
중요 포인트는
1. 소스 중간에 변수를 선언할 수 있다는 것. ( line 8,10 )
2. 배열 선언 시 그 크기를 변수로 지정해 줄 수 있다는 것 ( line 8 )
툴을 VS6을 써서 C를 배웠다면 저런 건 안 된다고 배웠겠지만;
99년 지정된 표준에서는 됨니다.
근데 VS2005랑 2008에서는 왜 안될까?
에러를 보면 위에 중요 포인트라고 짚은 것 때문에 안 되는 것이다.
컴파일러 옵션에서 뭘 설정해 줘야 할지도 모르겠다.
gcc에선 위의 코드가 잘 돌아간다.