2017년 5월 28일 일요일

load & load file with header in C ( C언어에서 헤더있는 file 저장과 읽기 )

load & load file with header in C ( C언어에서 헤더있는 file 저장과 읽기 )

헤더를 가지는 file의 save, load 입니다.

저장시 : header + 실제 데이터
로딩시 : header + 실제 데이터

typedef struct {
 char header_str[4];
 long int real_size;
}data_header;
헤더는 data_header 구조체로 만들어서 data의 앞쪽에 먼저 저장해서, 로딩시에는 처음 로딩이 됩니다.

long int load_file_with_header(char *filename, char *buf, long int buf_size, char *header, long int header_size)
filename : 읽고자 하는 파일이름
buf : 읽어서 저장되는 data buf 
buf_size : data buf 에 얼마나 읽어야 하는지에 대한 정보, 읽는양
header : header구조체의 pointer
header_size : 헤더의 크기

long int save_file_with_header(char *filename, char *buf, long int buf_size, char *header, long int header_size)
filename : 저장하고자 하는 파일이름
buf : 저장하고자 하는 data buf 
buf_size : data buf_size 크기정보
header : header구조체의 pointer
header_size : 헤더의 크기


헤더를 가지는 file의 save, load 예제
#include <stdio.h>
#include <stdlib.h>

typedef struct {
 char header_str[4];
 long int real_size;
}data_header;

long int load_file_with_header(char *filename, char *buf, long int buf_size, char *header, long int header_size)
{
 FILE *fp;
 long int rwsize1 = 0;
 long int rwsize2 = 0;
 fp = fopen(filename,"rb");
 if(fp==NULL) return -1;
 
 rwsize1 = fread(header,1,header_size,fp);
 if(rwsize1<=0){
  fclose(fp);
  return -1;
 }
 
 rwsize2 = fread(buf,1,buf_size,fp);
 if(rwsize2<=0){
  fclose(fp);
  return -1;
 }
 fclose(fp);
 return rwsize1+rwsize2;
}

long int save_file_with_header(char *filename, char *buf, long int buf_size, char *header, long int header_size)
{
 FILE *fp;
 long int rwsize1 = 0;
 long int rwsize2 = 0;
 fp = fopen(filename,"wb");
 if(fp==NULL) return -1;
 
 rwsize1 = fwrite(header,1,header_size,fp);
 if(rwsize1<=0){
  fclose(fp);
  return -1;
 }

 rwsize2 = fwrite(buf,1,buf_size,fp);
 if(rwsize2<=0){
  fclose(fp);
  return -1;
 }
 fclose(fp);
 return rwsize1+rwsize2;
}

// it returns sizes of file.
// if have an error, it will return the value minus.
long int get_file_length(char *filename)
{
 long int length = 0;
 FILE *fp;
 fp = fopen(filename,"rb");
 if( fp == NULL ) return -1;
 fseek(fp,0,2);
 length = ftell(fp);
 fclose(fp);
 return length;
}

int main()
{
 char data[]={'D','a','t','a','\n'};
 char *loaddata;
 long int size;
 data_header header_load;
 data_header header_save;
 
 header_save.header_str[0]='H';
 header_save.header_str[1]='E';
 header_save.header_str[2]='A';
 header_save.header_str[3]='D';
 header_save.real_size = sizeof(data);
 
 printf("saved size : %ld\n",save_file_with_header("sample.dat",data,sizeof(data),(char *)&header_save,sizeof(header_save)));
 
 size = get_file_length("sample.dat");
 loaddata = malloc(size+1-sizeof(header_save)); 
 printf("load size : %ld\n",load_file_with_header("sample.dat",loaddata,size-sizeof(header_save),(char *)&header_load,sizeof(header_load)));
 loaddata[size] = 0;
 
 printf("header:%c%c%c%c %ld\n",header_load.header_str[0],header_load.header_str[1],header_load.header_str[2],header_load.header_str[3],
  header_load.real_size);
 printf("data:%s\n",loaddata);
 free(loaddata);
 return 1;
}


실행 결과
E:\blogdata>gcc save_load_file_with_header.c

E:\blogdata>a
saved size : 13
load size : 13
header:HEAD 5
data:Data


E:\blogdata>dir sample.dat
 E:\blogdata 디렉터리

2017-05-28  오후 09:01                13 sample.dat
               1개 파일                  13 바이트



댓글 없음:

댓글 쓰기