IT_Programming/C · C++

[C] 파일 복사 ( 한번에 복사! and 가변인수 함수 사용)

JJun ™ 2009. 6. 21. 21:03

[실행화면]

 

 

 

================================================================================================

 

[소스코드]

 

/* 주제 : 파일의 사이즈가 얼마건간에 한번에 복사하자(읽어서 쓰자) 그리고 코드는 간결하게... */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>             // 가변 인수 사용을 위한 헤더 파일
#include <io.h>                   // filelength() 함수를 이용하기 위한 헤더 파일

 

#define ORIGINAL_FILE  0
#define COPY_FILE   1 
#define SIZE    50                                              // 파일명 사이즈
#define SAFE_FREE(p)  if(p) { free(p); p=NULL; } // 동적 메모리 해제 전처리문

 

char *input_fileName(char *filename, int flag); // 파일 이름 입력 함수
int get_fileSize(FILE *f);
void fp_close(int count, ...);              // 파일 포인터 해제 관련 가변 인수 함수
void memory_strFree(int count, ...);   // 문자열 동적 메모리 해제 관련 가변 인수 함수

 

int main(void)
{
     int file_size, size, result_size;
     char *readfilename, *writefilename, *buffer;
     FILE *fileread, *filewrite;

     readfilename = writefilename = NULL;

 

     while(1)
     {
          readfilename = input_fileName(readfilename, ORIGINAL_FILE); // 읽을 파일명 받음 
  
          fileread = fopen(readfilename, "r");    // 읽을 파일 열기
          if(fileread == NULL)       // 파일 존재 유무 확인
          {
               printf("파일이 존재하지 않습니다.\n");
               continue;
          }
  
          writefilename = input_fileName(writefilename, COPY_FILE); // 복사할 파일명 받음
  
          size = get_fileSize(fileread); // 파일의 크기를 구함
        //  size = filelength(fileno(fileread)); // filelength()는 이식성 때문에 자제하는 것이 좋다.   

    

          buffer = (char *)malloc(sizeof(char) * size); // 파일의 크기만큼 동적 메모리 할당

                                                                         // (한번에 읽을 목적)
          memset(buffer, '\0', sizeof(char) * size);
          fread(buffer, sizeof(char), sizeof(char)*size, fileread); // 파일 읽음

          filewrite = fopen(writefilename, "w+");   // 쓸 파일을 연다.

 

          // 파일 쓰기와 동시에 성공 유무 확인
          if((result_size = fwrite(buffer, sizeof(char), size, filewrite)) == size) 
               printf("%s 복사 성공!\n", writefilename);
  
         fp_close(2, filewrite, fileread);      // 파일 포인터 해제 - 가변 인자 함수

          // 문자열 동적 메모리 해제 - 가변 인자 함수
         memory_strFree(3, readfilename, writefilename, buffer); 
    }

    

   return 0;
}

 

char *input_fileName(char *filename, int flag) // 파일명 입력 (flag가 0이면 원본파일, 아니면 사본파일)
{
    printf((flag == ORIGINAL_FILE)? "input file name [원본 파일명] : " : "input file name [사본 파일명] : ");
    filename = (char *)malloc(sizeof(char) * SIZE);
    fgets(filename, SIZE, stdin);
    *(filename + (strlen(filename) - 1)) = '\0';

   

    return filename;
}

 

int get_fileSize(FILE *f)
{
    int size = 0;
    fseek(f, 0l, SEEK_END);
    size = ftell(f);
    fseek(f, 0l, SEEK_SET);

   

    return size;
}

 

void fp_close(int count, ...)  // 파일 포인터 해제 관련 가변 인수 함수
{
    int i;
    FILE *f;
    va_list ap;

    va_start(ap, count);

   

    for(i=0; i<count; ++i)
    {
        f = va_arg(ap, FILE*);
        fflush(f);
        fclose(f);
    }
}

 

void memory_strFree(int count, ...) // 문자열 동적 메모리 해제 관련 가변 인수 함수
{
    int i;
    char *str;
    va_list vlist;

    va_start(vlist, count);

 

    for(i=0; i<count; ++i)
    {
        str = va_arg(vlist, char*);
        SAFE_FREE(str);
    }
}

================================================================================================