-
C/C++ fread(3) fwrite(3)C,C++ & Linux 2020. 5. 22. 03:12728x90
함수 기능
파일을 바이너리로 읽거나 쓰는 함수
Linux/Unix 는 바이너리 파일을 구분하지 않기 때문에 큰 의미는 없으나 바이트 단위로 데이터를 읽거나 쓸때 유용합니다.
함수 원형
#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp); size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);
매개변수
ptr
읽거나 쓸 데이터가 저장된 주소
size
읽거나 쓸 오브젝트의 단위 크기
nobj
오브젝트의 갯수
fp
데이터를 읽거나 쓸 파일 포인터
반환값
성공적으로 읽거나 쓴 오브젝트의 갯수
예제
#include <stdio.h> #include <stdlib.h> #include <unistd.h> struct ssu_id { char name[64]; int id; }; int main(int argc, char *argv[]) { struct ssu_id t1, t2; char *fname = "ssu_exam.dat"; FILE *fp; if ((fp = fopen(fname, "w+")) == NULL) { fprintf(stderr, "fopen error\n"); exit(1); } printf("Input Name >>"); gets(t1.name); printf("Input ID >>"); scanf("%d", &t1.id); // 입력받은 데이터를 이진파일로 쓰고 if (fwrite(&t1, sizeof(struct ssu_id), 1, fp) != 1) { fprintf(stderr, "fwrite error\n"); exit(1); } fflush(fp); // 파일포인터를 초기화하여 rewind(fp); // 아까 쓴 내용을 그대로 읽어서 출력 if (fread(&t2, sizeof(struct ssu_id), 1, fp) != 1) { fprintf(stderr, "fread error\n"); exit(1); } printf("Name = %s\nID = %d\n", t2.name, t2.id); exit(0); }
결과
예제2
#include <stdio.h> #include <stdlib.h> #include <unistd.h> struct ssu_pirate { unsigned long booty; unsigned int beard_length; char name[128]; }; int main(int argc, char *argv[]) { struct ssu_pirate blackbeard = {950, 48, "Edward Teach"}, pirate; char *fname = "ssu_data"; FILE *fp1, *fp2; if ((fp1 = fopen(fname, "w")) == NULL) { fprintf(stderr, "fopen error\n"); exit(1); } if ((fp2 = fopen(fname, "r")) == NULL) { fprintf(stderr, "fopen error\n"); exit(1); } // 에드워드 티치에 대한 정보를 저장 if (fwrite(&blackbeard, sizeof(struct ssu_pirate), 1, fp1) != 1) { fprintf(stderr, "fwrite error\n"); exit(1); } // 파일을 닫기 if (fclose(fp1)) { fprintf(stderr, "fclose error\n"); exit(1); } // 에드워드 티치에 대한 정보를 다시 읽어들임 if (fread(&pirate, sizeof(struct ssu_pirate), 1, fp2) != 1) { fprintf(stderr, "fread error\n"); exit(1); } // 이름 출력 if (puts(pirate.name) == EOF) { fprintf(stderr, "fputs error\n"); exit(1); } // 나머지 정보 출력 printf("booty : %lu\nbeard_length = %u\n", pirate.booty, pirate.beard_length); if (fclose(fp2)) { fprintf(stderr, "fclose error\n"); exit(1); } exit(0); }
결과
리눅스시스템프로그래밍 저자 : 홍지만
https://book.naver.com/bookdb/book_detail.nhn?bid=14623672
책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)'C,C++ & Linux' 카테고리의 다른 글
C/C++ ftell(3), ftello(3) (0) 2020.05.22 C/C++ fseek(3), fseeko(3) (0) 2020.05.22 C/C++ puts(3), fputs(3) (0) 2020.05.22 C/C++ gets(3), fgets(3) (0) 2020.05.22 C/C++ putc(3), fputc(3), putchar(3) (0) 2020.05.22