터미널에서 사용하는 cd(change directory)와 pwd(print working directory)에 해당하는 명령어를 C에서도 사용하려면
Unix 기반 컴파일러(ex. gcc)는 unistd.h라는 헤더 파일을 include하면 되고,
Microsoft 기반 컴파일러(ex. Visual C++)는 direct.h라는 헤더 파일을 include하면 된다.
#include <unistd.h> // for Unix
#include <direct.h> // for Windows
cd에 대응되는 C언어 함수는 chdir(unistd.h)와 _chdir(direct.h)이고,
pwd에 대응되는 C언어 함수는 getcwd(unistd.h)와 _getcwd(direct.h)이다.
편의상 unistd.h를 include한다는 전제로 설명한다.
Visual C++에서는 아래의 과정에서 unistd.h 대신 direct.h, chdir 대신 _chdir, getcwd 대신 _getcwd를 쓰면 된다.
1. chdir
c 파일이 있는 경로에서 test_folder라는 폴더로 이동하는 걸 생각해보자.
터미널에서는 아래의 명령어로 가능하다.
$ cd test_folder
이에 대응되는 c 코드는 다음과 같다.
chdir("test_folder");
2. getcwd
위의 chdir가 실제로 이동했는지 확인하려면 이동 전 주소와 이동 후 주소를 print해서 비교해볼 수 있다.
현재 디렉토리 주소를 저장하기 위해 다음과 같은 cwd란 char 변수를 선언한다.
char cwd[1024];
이동 전 디렉토리 주소를 변수 cwd에 지정한 뒤 출력한다.
getcwd(cwd, sizeof(cwd));
printf("%s\n",cwd);
위의 chdir을 이용해 test_folder로 이동한다.
chdir("test_folder");
이동 후 디렉토리 주소를 cwd에 지정한 뒤 출력한다.
getcwd(cwd, sizeof(cwd));
printf("%s\n",cwd);
위 과정을 담은 test.c 코드와 실행 결과는 다음과 같다.
// test.c #include <stdio.h> #include <unistd.h> int main() { char cwd[1024]; getcwd(cwd, sizeof(cwd)); printf("%s\n",cwd); chdir("test_folder"); getcwd(cwd, sizeof(cwd)); printf("%s\n",cwd); return 0; }
위의 test.c 실행 결과
Visual C++에서 사용할 수 있는 test_win.c 코드와 실행 결과는 다음과 같다.
// test_win.c #include <stdio.h> #include <direct.h> int main() { char cwd[1024]; _getcwd(cwd, sizeof(cwd)); printf("%s\n",cwd); _chdir("test_folder"); _getcwd(cwd, sizeof(cwd)); printf("%s\n",cwd); return 0; }
위의 test_win.c의 실행 결과
Reference)
https://stackoverflow.com/questions/16285623/pwd-to-get-path-to-the-current-file
http://www.manpagez.com/man/2/chdir/
http://www.manpagez.com/man/3/getcwd/
https://msdn.microsoft.com/en-us/library/bf7fwze1.aspx
https://msdn.microsoft.com/en-us/library/sf98bd4y.aspx
'Programming > C' 카테고리의 다른 글
Visual C++을 command line으로 사용하기 (0) | 2017.09.11 |
---|---|
Sorting Algorithms Animations (0) | 2016.12.25 |
Windows에서 gcc 설치하기 (2) | 2016.12.25 |
Intel MKL 설정하기 (0) | 2016.11.28 |
OS X에서 gcc로 Open MPI 설행하기 (0) | 2016.11.15 |