C,C++ & Linux
C/C++ fread(3) fwrite(3)
KyooDong
2020. 5. 22. 03:12
728x90
함수 기능
파일을 바이너리로 읽거나 쓰는 함수
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
책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)