C - 파일 입,출력
Updated:
제가 C언어를 공부하면서 배웠던 문제를 공유하겠습니다.
이번 post는 간단히 raw 이미지파일을 읽어 들이고, 그것을 출력 버퍼에 복사한 뒤 다시 다른 파일에 그대로 쓰는 것입니다.
이번 코드의 경우 이미지에 아무런 처리를 하지 않았기 때문에 완전히 똑같은 이미지 하나를 만들어내는 것입니다.
입력의 lena파일은 512*512 size의 사진파일입니다.
#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차원 배열 결과
-
2차원 배열 결과
코딩의 방법만 바뀌는 것이지 내용은 원본 그대로 복사됨을 확인할 수 있습니다.
Leave a comment