프로그래밍 언어/C & C++ 정리

파일 복사 프로그램

게임 개발 2024. 7. 9. 10:39

복사할 파일명과 복사 후 생성되는 파일명을 입력받아서 파일을 복사하는 프로그램을 작성하라.

단, txt파일 뿐만 아니라 이미지 파일 등..

모든 종류의 파일에 다 동일하게 적용할 수 있어야 한다.

복사 진행 과정을 백분율로 화면에 표시해주도록하고 n바이트씩 복사하도록 한다.

ex)

4바이트

- 원본 파일 : source.txt

- 대상 파일 : dest.txt

#define _CRT_SECURE_NO_WARNINGS 

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

void copy_file(const char* src_file, const char* dest_file, size_t buffer_size) {
    FILE* src, * dest;
    char* buffer;
    size_t bytes_read, total_bytes = 0, file_size;

    // 원본 파일 열기
    src = fopen(src_file, "rb");
    if (src == NULL) {
        perror("파일이 없습니다.");
        exit(EXIT_FAILURE);
    }

    // 복사할 파일 열기
    dest = fopen(dest_file, "wb");
    if (dest == NULL) {
        perror("파일이 없습니다.");
        fclose(src);
        exit(EXIT_FAILURE);
    }

    // 원본 파일 크기 얻기
    fseek(src, 0, SEEK_END);
    file_size = ftell(src);
    fseek(src, 0, SEEK_SET);

    // 버퍼 할당
    buffer = (char*)malloc(buffer_size);
    if (buffer == NULL) {
        perror("버퍼 할당 실패");
        fclose(src);
        fclose(dest);
        exit(EXIT_FAILURE);
    }

    // 파일 복사
    while ((bytes_read = fread(buffer, 1, buffer_size, src)) > 0) {
        fwrite(buffer, 1, bytes_read, dest);
        total_bytes += bytes_read;

        // 진행 상황 표시
        printf("\n 진행 과정 : %.2f%%", (double)total_bytes / file_size * 100);
        fflush(stdout);
        system("cls");
    }

    printf("\n복사가 완료되었습니다.\n");

    // 파일 및 버퍼 닫기
    free(buffer);
    fclose(src);
    fclose(dest);
}

int main() {
    char src_file[256] = "../data/a.txt";
    char dest_file[256] = "../data/b.txt";
    size_t buffer_size;

    // 사용자로부터 파일명과 버퍼 크기 입력받기
    printf("원본 파일 경로와 타입을 입력해주세요 : ");
    scanf("%255s", src_file);
    printf("복사할 파일 경로와 타입을 입력해주세요 : ");
    scanf("%255s", dest_file);
    printf("한번에 복사할 바이트 입력해주세요 : ");
    scanf("%zu", &buffer_size);

    // 파일 복사 함수 호출
    copy_file(src_file, dest_file, buffer_size);

    return 0;
}

'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글

C++ 기억 존속 시간, 사용 범위  (0) 2024.08.01
템플릿  (0) 2024.07.31
파일 읽고 쓰기 - C언어  (0) 2024.07.05
함수와 스택 그리고 호출 스택  (1) 2024.06.25
동적 바인딩 정적 바인딩  (0) 2024.06.05