파일 입출력 in C
by DINHO
안녕하세요. 오늘은 C언어 공부를 하면서 풀었던 예제를 공유하겠습니다. 앞으로도 제가 풀었던 C예제를 계속 공유하겠습니다!!
이번 예제는 간단히 raw 이미지파일을 읽어 들이고, 그것을 출력 버퍼에 복사한 뒤 다시 다른 파일에 그대로 쓰는 것으로, 이미지에 아무런 처리를 하지 않았기 때문에 완전히 똑 같은 이미지 하나를 만들어내는 것입니다!! 아래는 예제 코드입니다.
예시 입력 파일로는 Lena_512.raw파일을 사용했습니다. 이미지 크기는 가로 세로 512*512입니다. (영상 신호처리를 공부한 사람이라면 한 번쯤은 마주치게 될 이미지입니다ㅋㅋㅋㅋㅋㅋㅋ) 각 코드 줄에 대한 설명은 주석 처리해 두었습니다!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define VER 512
#define HOR 512
#define F_SIZE (VER*HOR)
unsigned char** alloc_pic_2d(int width, int height); // 2D 배열 함수 선언
int main()
{
int i, j;
unsigned char** ori_pic_2d = alloc_pic_2d(HOR, VER); // 원본 이미지 2D 배열을 위한 메모리 할당
unsigned char** modi_pic_2d = alloc_pic_2d(HOR, VER); // 복사 이미지 2D 배열을 위한 메모리 할당
FILE * fin2, * fout2; // 파일 포인터 선언
fin2 = fopen("Lena_512.raw", "rb"); // 바이너리 읽기 모드를 위한 입력 파일 열기 (for the 2D case)
fout2 = fopen("Copy_Lena_512_2d.raw", "wb"); // 바이너리 쓰기 모드를 위한 출력 파일 열기 (for the 2D case)
if (!fin2) // 입력 파일이 성공적으로 열렸는지 확인
{
printf("ERROR :: File Can't Read\n"); // Print error message
exit(1); // Exit the program with an error code
}
if (!fout2) // 출력 파일이 성공적으로 열렸는지 확인
{
printf("ERROR :: File Can't Save\n"); // Print error message
exit(1); // Exit the program with an error code
}
for (i = 0; i < VER; i++) // 이미지 세로 크기만큼 1씩 증가하면서 루프 반복
fread(ori_pic_2d[i], sizeof(unsigned char), VER, fin2); // 입력 파일의 각 줄을 ori_pic_2d 배열로 읽어 옴
for (j = 0; j < VER; j++)
{
for (i = 0; i < HOR; i++) // 이미지 가로 크기만큼 1씩 증가하면서 루프 반복
{
modi_pic_2d[j][i] = ori_pic_2d[j][i]; // ori_pic_2d 이미지에서 각 픽셀을 복사하여 modi_pic_2d에 저장
}
}
for (i = 0; i < VER; i++) {
fwrite(modi_pic_2d[i], sizeof(unsigned char), VER, fout2); // 입력 파일의 각 줄을 modi_pic_2d 배열에 씀
}
fclose(fin2); // 입력파일 닫기
fclose(fout2); // 출력 파일 닫기
for (i = 0; i < VER; i++) // 배열 메모리 할당 해제를 위한 반복
{
free(ori_pic_2d[i]); // ori_pic_2d 각 열 메모리 해제
free(modi_pic_2d[i]); // modi_pic_2d 각 메모리 해제
}
free(ori_pic_2d); // 원본 2D 그림 배열의 포인터에 대한 메모리를 확보
free(modi_pic_2d); // 복사 2D 그림 배열의 포인터에 대한 메모리를 확보
return 0; // Return success
}
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;
}
Follow my github