사용범위
Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수
기능
C언어 표준 함수로 배열의 데이터를 FILE에 기록한다.
헤더
#include <stdio.h>
※ fwrite 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※
함수
size_t fwrite(const void* ptr, size_t size, size_t count, FILE *file);
파라미터
- const void* ptr
- FILE* 에 기록할 데이터가 저장된 배열(버퍼)을 입력한다.
- size_t size
- ptr 에 저장할 배열의 원소 하나의 크기를 입력한다.
(ex: char a[3] : sizeof(char), struct str_t[3] : sizeof(struct str_t))
- ptr 에 저장할 배열의 원소 하나의 크기를 입력한다.
- size_t count
- 파일에 저장할 배열(ptr)의 원소 개수를 입력한다. (ex: char[3] : 3 , struct str_t[4] : 4)
- FILE* file
- fopen 함수를 통해 얻은 FILE의 포인터를 입력한다.
반환값
성공시 fwrite 를 통해 실제로 기록된 배열의 원소 개수를 반환한다.
실패시 실제로 기록되어야할 원소의 개수가 아닌 값이 리턴된다.
<소스 코드>
#include <stdio.h>
#define MAX_PROC_NAME_SIZE 20
#define MAX_PROC_NUM 10
typedef struct {
int pid;
unsigned long long used_memory;
char name[MAX_PROC_NAME_SIZE];
} process_info_t;
int main() {
FILE *fp;
int i;
size_t ret;
process_info_t readProcessInfo[MAX_PROC_NUM];
process_info_t writeProcessInfo[MAX_PROC_NUM];
// 초기화
memset(readProcessInfo, 0, sizeof(process_info_t)*MAX_PROC_NUM);
memset(writeProcessInfo, 0, sizeof(process_info_t)*MAX_PROC_NUM);
// process info 정보 입력
{
writeProcessInfo[0].pid = 1;
writeProcessInfo[0].used_memory = 10*1024*1024; // 10MB
strncpy(writeProcessInfo[0].name, "first process", MAX_PROC_NAME_SIZE - 1);
writeProcessInfo[1].pid = 2;
writeProcessInfo[1].used_memory = writeProcessInfo[0].used_memory*1024; // 10GB
strncpy(writeProcessInfo[1].name, "second process", MAX_PROC_NAME_SIZE - 1);
}
fp = fopen("test.txt", "wb");
if (fp != NULL) {
// 파일에 write
ret = fwrite(writeProcessInfo, sizeof(process_info_t), 2, fp);
printf("[fwrite]ret = %d\n", (int)ret);
if(ret != 2) {
// fwrite 가 데이터를 정상적으로 기록하지 못했음
}
fclose(fp);
} else {
// fopen failed
}
fp = fopen("test.txt", "rb");
if (fp != NULL) {
// 파일로부터 read
ret = fread(readProcessInfo, sizeof(process_info_t), MAX_PROC_NUM, fp);
if(ret > 0) {
printf("[fread]ret = %d\n", (int)ret);
for(i=0; i<ret; i++) {
printf("process_info[%d] - pid[%d]\n", i, readProcessInfo[i].pid);
printf("process_info[%d] - used_memory[%llu]\n", i, readProcessInfo[i].used_memory);
printf("process_info[%d] - name[%s]\n", i, readProcessInfo[i].name);
}
} else {
// fread 가 데이터를 정상적으로 읽지 못했음
}
fclose(fp);
} else {
// fopen failed
}
return 0;
}
※ 실행 결과
[fwrite]ret = 2
[fread]ret = 2
process_info[0] - pid[1]
process_info[0] - used_memory[10485760]
process_info[0] - name[first process]
process_info[1] - pid[2]
process_info[1] - used_memory[10737418240]
process_info[1] - name[second process]
< test.txt >
? first process second process
※ 데이터가 깨지는 이유 : fwrite는 인간이 아닌 컴퓨터가 사용중인 메모리에 들고있는 데이터를 그대로 파일에 저장한다. 따라서 메모장 또는 notepad++ 같은 프로그램으로 보면 데이터가 깨져보이지만 fread 함수를 통해 데이터를 읽은후 출력해보면 정상적으로 나오는것을 확인할 수 있다.
반응형
'C언어 > stdio.h' 카테고리의 다른 글
[C언어] sprintf 함수 (stdio.h) (0) | 2022.08.07 |
---|---|
[C언어] fflush 함수 (stdio.h) (0) | 2022.08.04 |
[C언어] fread 함수 (stdio.h) (0) | 2022.08.03 |
[C언어] fclose 함수 (stdio.h) (0) | 2022.08.02 |
[C언어] fopen 함수 (stdio.h) (1) | 2022.08.01 |