[실행화면]
================================================================================================
[소스코드]
/* 주제 : 파일의 사이즈가 얼마건간에 한번에 복사하자(읽어서 쓰자) 그리고 코드는 간결하게... */
#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);
}
}
================================================================================================
'IT_Programming > C · C++' 카테고리의 다른 글
[c] 업그레이드 고객 관리 컨솔 프로그램 (0) | 2009.06.23 |
---|---|
[C] 간단하게 만든 (콘솔) 고객 정보 관리 프로그램 (파일 입출력) (0) | 2009.06.22 |
[C_구조체 동적할당] 콘솔 기반 고객 관리 프로그램 (memmove() 함수 사용) (0) | 2009.06.17 |
[C] 외부함수 호출해서 사용하기 (0) | 2009.06.16 |
[C] 구조체 배열_학생 성적 그래프 (0) | 2009.06.16 |