K 개발자

고수준 파일 입출력 본문

유닉스(Unix)/시스템 프로그래밍

고수준 파일 입출력

ddingz 2021. 8. 15. 12:05

파일 포인터

저수준 파일 입출력에서는 열린 파일을 가리키는 데 파일 기술자를 사용하는 한편, 고수준 파일 입출력에서는 파일 포인터file pointer를 사용한다.
파일 포인터는 디스크에서 메모리로 읽어온 파일의 위치(주소)에 관한 정보를 담고 있는 포인터다.
또한 파일 기술자는 정수형이지만, 파일 포인터는 시스템 헤더 파일에 정의되어 있는 FILE * 형이다.


파일 열기와 닫기

파일 열기 : fopen(3)

#include <stdio.h>

FILE *fopen(const char *filename, const char *mode);
// filename : 파일의 경로, mode : 파일 열기 모드

파일 닫기 : fclose(3)

#include <stdio.h>

int fclose(FILE *stream);
// stream : fopen에서 리턴한 파일 포인터

문자 기반 입출력

문자 기반 입력 함수 : fgetc(3), getc(3), getchar(3), getw(3)

#include <stdio.h>

int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
int getw(FILE *stream);
// stream : 파일 포인터

문자 기반 출력 함수 : fputc(3), putc(3), putchar(3), putw(3)

#include <stdio.h>

int fputc(int c, *stream);
int putc(int c, *stream);
int putchar(int c);
int putw(int w, FILE *stream);
// c, w : 출력할 문자, stream : 파일 포인터

문자열 기반 입출력

문자열 기반 입력 함수 : gets(3), fgets(3)

#include <stdio.h>

char *gets(char *s);
char *fgets(char *s, int n, FILE *stream);
// s : 문자열을 저장한 버퍼의 시작 주소 , n : 버퍼의 크기, stream : 파일 포인터

문자열 기반 출력 함수 : puts(3), fputs(3)

#include <stdio.h>

int puts(const char *s);
int fputs(const char *s, FILE *stream);
// s : 문자열 주소, stream : 파일 포인터

버퍼 기반 입출력

버퍼 기반 입력 함수 : fread(3)

# include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
// ptr : 버퍼 주소, size : 버퍼 크기, nitems : 읽어올 항목 수, stream : 파일 포인터

버퍼 기반 출력 함수 : fwrite(3)

#include <stdio.h>

size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);
// ptr : 버퍼 주소, size : 항목의 크기, nitems : 항목 수, stream : 파일 포인터

형식 기반 입출력

형식 기반 입력 함수 : scanf(3), fscanf(3)

#include <stdio.h>

int scanf(const char *restrict format, ...);
int fscanf(FILE *restrict stream, const char *restrict format, ...);
// format : 입력 형식(%d, %s 등), stream : 파일 포인터

형식 기반 출력 함수 : printf(3), fprintf(3)

#include <stdio.h>

int printf(const char *restrict format, /* args */ ...);
int fprintf(FILE *restrict stream, const char *restrict format, /* args */ ...);
// stream : 파일 포인터, format : 출력 형식, args : 출력 변수

파일 오프셋 지정

파일 오프셋 이동 : fseek(3)

#include <stdio.h>

int fseek(FILE *stream, long offset, int whence);
// stream : 파일 포인터, offset : 이동할 오프셋, whence : 오프셋의 기준 위치

현재 오프셋 구하기 : ftell(3)

#include <stdio.h>

long ftell(FILE *stream);
// stream : 파일 포인터

처음 위치로 오프셋 이동 : rewind(3)

#include <stdio.h>

void rewind(FILE *stream);
// stream : 파일 포인터

오프셋의 저장과 이동 : fsetpos(3), fgetpos(3)

#include <stdio.h>

int fsetpos(FILE *stream, const fpos_t *pos);
int fgetpos(FILE *stream, fpos_t *pos);
// stream : 파일 포인터, pos : 오프셋을 저장하고 있는 영역 주소(fsetpos), 오프셋을 저장할 영역 주소(fgetpos)

파일과 디스크 동기화 함수

파일과 디스크 동기화 함수 : fflush(3)

#include <stdio.h>

int fflush(FILE *stream);
// stream : 파일 포인터
Comments