C언어/stdio.h

[C언어] fwrite 함수 (stdio.h)

아무일도없었다 2022. 8. 4. 12:16

사용범위

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))
  • 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