[C]파일입출력 함수(2)[fread, fwrite]


이 포스트는 fread함수 fwrite함수에 관한 내용입니다.


4️⃣ fread함수

  • size바이트짜리 데이터를 총 count개수만큼 읽어서 buffer에 저장합니다.
    EOF를 만나면 읽기를 멈춥니다.

< 함수원형 >

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

< 함수사용 >

#include <stdio.h>
#define BUFFER (1024)

int main(void)
{
    FILE *stream;
    int word_count;
    char result[BUFFER] = { 0, };

    stream = fopen("test.txt", "r"); //test.txt를 읽기형식으로 오픈
    word_count = fread(result, sizeof(char), BUFFER, stream);
    printf("readword: %d\n", word_count);
    printf("%s\n", result);
    fclose(stream);
}
/*---test.txt내용---*/
12345
67
89
/*---출력---*/
readword: 11
12345
67
89
  • 위의 코드에서처럼 "r"mode로 읽었을 경우 fread함수의 반환값으로 11이 나왔습니다. 반면 "rb"mode로 읽었을 경우 반환값이 나왔습니다.(윈도우Vscode기준)
  • 즉 윈도우환경에서 바이너리(이진)모드로 읽을 경우 '\r'까지 읽어들임을 알 수 있었고 text작성에서 줄바꿈시 '\r\n'형식으로 작성됨을 알 수 있었습니다.
  • 위에 코드에서는 sizeof(char)의 형식으로 size값을 넣어줬습니다. 하지만 기본 데이터형의 크기는 시스템마다 달라질 수 있습니다. 이러한 이유로 엉뚱한 데이터가 읽힐 수도 있습니다.(4바이트 int로 생각했지만 2바이트씩 읽히는등…)
    그렇기 때문에 정확히 파일에 저장할 데이터 크기를 고정해 두는게 좋습니다. sizeof(char)보다는 1로 작성하는 것이 더 안전할 것 입니다.

5️⃣ fwrite함수

< 함수원형 >

size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);
  • buffer에서 size바이트짜리 데이터를 총 count개수만큼 읽어서 파일에 작성합니다.

< 함수사용 >

#include <stdio.h>
#define BUFFER (20)

int main(void)
{
    FILE *stream;
    int word_count;
    char result[BUFFER] = "hello\n";

    stream = fopen("test.txt", "w"); //test.txt를 읽기형식으로 오픈
    word_count = fwrite(result, sizeof(char), BUFFER, stream);
    printf("writeword: %d\n", word_count);
	fclose(stream);
}
/*---출력---*/
writeword: 20
/*---test.txt에 쓰인내용---*/
hello
@@@@@@@@@@@@@@   //14개의 쓰래기문자가 채워짐 @로 단순하게 표현
  • EOF를 만나면 읽기를 멈췄던 fread함수와 달리 fwrite함수는 20개(2번째인자 x 3번째인자)만큼 파일에 작성했습니다.정확한 BUFFER의 크기를 넣어줘야합니다
  • fread함수의 경우와 마찬가지로 두번째인자인 size의 값을 고정된 값으로 넣는 것이 좋습니다. sizeof(char)보다는 1로 작성하는 것이 더 안전할 것 입니다.



이전포스트 > [C]파일입출력 함수(1)[stream, fopen, fclose]

다음포스트 > [C]파일입출력 함수(3)[스트림 표시자]





© 2021.02. by kirim

Powered by kkrim