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 바이트
댓글 없음:
댓글 쓰기