C - 파일 입,출력

Updated:

제가 C언어를 공부하면서 배웠던 문제를 공유하겠습니다.

이번 post는 간단히 raw 이미지파일을 읽어 들이고, 그것을 출력 버퍼에 복사한 뒤 다시 다른 파일에 그대로 쓰는 것입니다.

이번 코드의 경우 이미지에 아무런 처리를 하지 않았기 때문에 완전히 똑같은 이미지 하나를 만들어내는 것입니다.

입력의 lena파일은 512*512 size의 사진파일입니다.

원본_rena

#pragma warning(disable:4996);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define VER 512      // VER = 512
#define HOR 512      // HOR = 512
#define F_SIZE (VER*HOR)   //F_SIZE = 512*512

/* 함수선언*/
unsigned char* alloc_pic(int SIZE); //함수 포인터 선언
unsigned char** alloc_pic_2d(int width, int height); //더블 함수 포인터 선언

int main()
{
    int i, j;

    unsigned char* ori_pic = alloc_pic(F_SIZE);
    //alloc_pic(사이즈가 512*512)일 때 포인터 변수 *ori_pic
    unsigned char* modi_pic = alloc_pic(F_SIZE);
    //alloc_pic(사이즈가 512*512)일 때 포인터 변수 *modi_pic

    unsigned char** ori_pic_2d = alloc_pic_2d(HOR, VER);
    //alloc_pic_2d(사이즈가 512*512)일 때 더블 포인터 변수 *ori_pic_2d
    unsigned char** modi_pic_2d = alloc_pic_2d(HOR, VER);
    //alloc_pic_2d(사이즈가 512*512)일 때 더블 포인터 변수 *modi_pic_2d
    FILE* fin1, * fin2, * fout1, * fout2;

    fin1 = fopen("Lena_512.raw", "rb");  //"Lena_512"를 만들고 입력 스트림 생성
    fout1 = fopen("Copy_Lena_512.raw", "wb"); //"Copy_Lena"를 만들고 출력 스트림 생성

    fin2 = fopen("Lena_512.raw", "rb");  //"Lena_512"를 만들고 입력 스트림 생성
    fout2 = fopen("Copy_Lena_512_2d.raw", "wb"); //"Copy_Lena_2d"를 만들고 출력 스트림 생성

    if (!fin1)
    {
        printf("ERROR :: File Can't Read\n");  //fin1이 0일 때 에러 출력 및 종료
        exit(1);
    }
    if (!fout1)
    {
        printf("ERROR :: File Can't Save\n");   //fout1이 0일 때 에러 출력 및 종료
        exit(1);
    }
    if (!fin2)
    {
        printf("ERROR :: File Can't Read\n");   //fin2가 0일 때 에러 출력 및 종료
        exit(1);
    }
    if (!fout2)
    {
        printf("ERROR :: File Can't Save\n");   //fout2가 0일 때 에러 출력 및 종료
        exit(1);
    }

    fread((void*)ori_pic, sizeof(unsigned char), F_SIZE, fin1);
    // fin1에서 (sizeof(char))의 크기만큼 (F_SIZE=512*512)개 가져와서 (ori_pic)에 저장
    memcpy(modi_pic, ori_pic, F_SIZE * sizeof(unsigned char));
    // ori_pic을 F_SIZE*sizeof(unsigned char)만큼 modi_pic에 덮어써라
    fwrite((void*)modi_pic, sizeof(unsigned char), F_SIZE, fout1);
    // modi_pic을 sizeof(unsigned char)만큼 F_SIZE(512*512)개 fout1에 저장

    for (i = 0; i < VER; i++)
        fread(ori_pic_2d[i], sizeof(unsigned char), HOR, fin2);
    // ori_pic_2d[i]에 sizeof(unsigned char)의 크기를 HOR개 저장 및 i증가하면서 저장 반복
    for (j = 0; j < VER; j++)
    {
        for (i = 0; i < HOR; i++)
        {
            modi_pic_2d[j][i] = ori_pic_2d[j][i];
        }
    } // ori_pic_2d의 값들을 modi_pic_2d의 값에 저장(복사)

    for (i = 0; i < VER; i++)
        fwrite((void*)modi_pic_2d[i], sizeof(unsigned char), HOR, fout2);
    //modi_pic_2d[i]의 값들을 fout2로 write시킴 및 VER번 반복

    fclose(fin1);   // fin1 스트림 종료
    fclose(fout1);   // fout1 스트림 종료
    fclose(fin2);   // fin2 스트림 종료
    fclose(fout2);   // fout2 스트림 종료

    for (i = 0; i < VER; i++)
    {
        free(ori_pic_2d[i]);   //ori_pic_2d[i] 제거
        free(modi_pic_2d[i]);   //modi_pic_2d[i] 제거
    }

    free(ori_pic_2d);
    free(modi_pic_2d);
    free(ori_pic);
    free(modi_pic);

    return 0;
}

unsigned char** alloc_pic_2d(int width, int height) // 2차원 배열 메모리 할당 함수
{
    unsigned char** pic;
    int i;

    if ((pic = (unsigned char**)calloc(width, sizeof(unsigned char*))) == NULL)
    {
        printf("\n malloc_picture : Picture structure \n");
        exit(1);
    }

    for (i = 0; i < height; i++)
    {
        if ((pic[i] = (unsigned char*)calloc(height, sizeof(unsigned char))) == NULL)
        {
            printf("\n malloc_picture : Picture structure \n");
            exit(1);
        }
    }
    return pic;
}
unsigned char* alloc_pic(int SIZE) // 1차원 배열 메모리 할당 함수
{
    unsigned char* pic;

    if ((pic = (unsigned char*)calloc(SIZE, sizeof(unsigned char))) == NULL)
    {
        printf("\n malloc_picture : Picture structure \n");
        exit(1);
    }
    return pic;
}

저장된 파일
1차원 배열과 2차원 배열로 저장된 파일을 확인할 수 있습니다.

  • 1차원 배열 결과 1d_rena

  • 2차원 배열 결과 2d_rena

코딩의 방법만 바뀌는 것이지 내용은 원본 그대로 복사됨을 확인할 수 있습니다.

첫 포스팅인 만큼 주석을 많이 달았습니다.

lena파일은 코드가 저장된 장소에 넣으면 됩니다.

Leave a comment