easy software

C언어 파일입출력 main에서 파일명을 받아 파일복사하기 본문

C언어/FILE IO

C언어 파일입출력 main에서 파일명을 받아 파일복사하기

JAVA 웹개발자 2015. 2. 12. 23:14

실행파일의 이름이 test.exe라면 명령어의 형식은 아래와 같게하려고 합니다.

 

c:\> test mystory.txt mystory2.txt

 

mystory.txt의 데이터를 그대로 복사하여 mystory2.txt에 저장하라는 명령입니다.

 

위의 명령은 cmd에서 실행합니다.

 

c드라이브에 바로 test.exe파일이 있다면 위의 명령어를 입력하시면 됩니다.

 

만약 다른경로에 있다면, ' cd 폴더명 ' cmd명령어를 이용하여 디렉토리를 이동하세요.

 

저는 실행파일을 바탕화면에 두어서 cd desktop을 이용하여 바탕화면으로 이동 후 실행했습니다.

 

 

 

 

위의 프로그램을 구현하기에 앞서, main함수도 인자를 받을 수 있다는 걸 알아야 합니다.

 

보통은 int main(void)로 메인함수를 구현합니다.

 

그런데 이번에는 int main(int argc, char** argv)로 구현해야 합니다.

 

argc는 문자열이 몇개 입력되었는지 count를 하고,

 

argv는 입력된 문자열을 가리킵니다.

 

c:\> test   mystory.txt   mystory2.txt

 

위의 문장에서 보시다시피 각각 띄어쓰기를 해서 문자열을 구분해주고 있습니다.

 

argv[0]은 "test"를 가리키고, argv[1]은 "mystory.txt"를 가리킵니다. 이해되시죠?

 

 

 

#include <stdio.h>

 

//인자를받는 main함수 구현
int main(int argc, char** argv){

 

     //문자열이 세개 전달 되었다면 복사를 진행
     if (argc == 3){
          int state, state2;
          char a;

 

          //데이터를 읽기위한 스트림 생성
          FILE* fp = fopen(argv[1], "rt");

 

          //데이터를 쓰기위한 스트림 생성
          FILE* fp2 = fopen(argv[2], "at");

 

          /* fopen함수는 오류발생시 NULL을 리턴하므로
          파일 개방 중 오류발생시 프로그램을 종료 */
          if (fp == NULL || fp2 == NULL){
               printf("스트림 생성시 오류발생");
               return 1;
          }

 

          /* 파일에 얼마의 데이터가 있는지 모른다고 가정
          무한루프를 돌면서 계속 데이터를 출력
          파일에 끝에 도달하면 feof함수에 의해 반복문 탈출 */
          while (1){
               if (feof(fp) != 0){
                    printf("복사가 완료되었습니다.\n");
                    break;
               }

 

               //한글자씩 꺼내서 mystory2.txt에 저장
               a = fgetc(fp);
               fputc(a, fp2);
          }

 

          /* fclose함수는 종료시 오류가 발생하면
          0이 아닌 다른값을 리턴하므로 비정상 종료로 판단되면
          안내후 프로그램을 종료 */
          state = fclose(fp);
          state2 = fclose(fp2);
          if (state != 0 || state2 != 0){
               printf("스트림 제거시 오류발생");
               return 1;
          }

     }

 

     else{
          printf("적절치 않은 명령입니다.\n");
          return 1;
     }

     return 0;
}

 

 

프로그램의 흐름은 이러합니다.

 

main함수에서 인자를 전달 받을 수 있도록 합니다.

 

그리고 if문을 통하여 세개의 인자가 전달되면 코드를 실행하고, 아니면 오류를 발생시킵니다.

 

후에 원본파일을 rt모드로 열고, 복사본파일을 at모드로 엽니다.

 

복사본파일이 없다면, 새로 생성될 것입니다.

 

스트림 생성 중 하나의 파일에서라도 오류가 발생하면 프로그램을 종료합니다.

 

정상적으로 스트림이 생성되면, 무한루프를 돌립니다.

 

루프안에는 feof함수가 파일에 끝에 도달했는지를 검사하며,

 

파일의 끝이 아닐경우 계속 복사를 진행합니다.

 

복사가 완료되면 반복문을 빠져나가고, 스트림을 제거합니다.

 

역시 스트림제거시에도 오류가 발생하면 사용자에게 오류내용을 알려줍니다.

 

 

어떻게 보면 상당히 어려운 문제가 될 수 있습니다.

 

main함수의 인자전달 방법도 알아야하고, 파일에 관련된 함수와 반복문, 조건문을

 

적절히 혼합하여 구현해야 합니다.

 

하지만 위의 설명에서 보시다시피 설계하는데에는 크게 복잡하지 않습니다.

 

여러번 반복하고 응용하다보면 쉽게 할 수 있는 예제였습니다.

Comments