리눅스

chapter02 파일 입출력(03)

정지홍 2023. 2. 12. 15:43

고수준 파일 입츨력

고수준 파일 입출력은 표준 입출력 라이브러리라고 한다.

저수준과 비교한다면 저수준은 바이트 단위로 입출력을 수행하며 고수준은 문자,행,버퍼,형식 기반 입출력이다.

 

파일 포인터?

-저수준의 파일 기술자와 비슷한 것

-디스크에서 메모리로 읽어온 파일의 위치에 관한 정보를 담고 있는 포인터

-파일 기술자는 정수형이지만 파일 포인터는 FILE* 형태이다.

-파일 열기 fopen----->FILE *fopen (const char *filename , const char *mode);

-파일 닫기 fclose----->int fclose(FILE *stream);

 

문자 기반 입출력

-fget(FILE *stream);  파일포인터가 가르키는 문자 1개를 읽어온다.

-getc(FILE *stream);  fget과 비슷하나 매크로로 구현되어 있음. 대신에 실행 속도는 빠르고 메모리도 더 잡아먹음

-getchar(void);  표준 입력에서 문자 한 개를 읽어온다

-getw(FILE *stream); 파일에서 워드 단위로 읽어온다.

 

fgetc함수로 EOF만날때까지 한 문자씩 읽는다


문자열 기반 입력

-성능이 좋다

-포인터형 변수는 시작주소만 줘서 끝주소가 없다.--> 계속 증가하면 다른 데이터에 접근 가능

-char *gets(char *s);  표준 입력에서 문자열을 읽어들인다. 크기를 지정해주지 않아 메모리의 크기를 알수없어서 s가 가득차도 계속 읽을수 있어서 보안 침해 문제 발생한다.

-char *fgets(char *s , int n , FILE *stream);

 

문자열 기반 출력

-int puts(const char *s);

int fputs(const char *s, FILE *stream);

fgets함수로 리턴값이 NULL이 될때까지 한 행씩 버퍼로 읽어옴


버퍼 기반 입출력

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

-위 함수는 항목크기가 size인 데이터를 nitems에서 지정 개수만큼 읽어서 ptr이 가리키는 버퍼에 저장


버퍼 기반 출력 함수

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

-이 함수는 항목의 크기가 size인 데이터를 nitems에서 지정 수 만큼 포인터에서 읽어서 지정한 파일에 출력

6바이트씩 읽어온다(항목의 크기를 2배로 늘리고 한 번에 읽어올 개수를 3으로 지정해서)


형식 기반 입력

-int scanf(const char *restrict format입력형식);

-int fscanf(FILE *restrict stream파일 포인터 , const char *restrict format입력형식);

 

형식 기반 출력

-int printf(const char *restrict format, args 출력 변수);

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


파일 오프셋 이동

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

-stream이 가르키는 파일에서 offset에 지정한 크기만큼 오프셋을 이동시킨다.

whence에 사용 가능 값

  • SEEK_SET파일의 시작 기준
  • SEEK_CUR현재 위치 기준
  • SEEK_END파일의 끝 기준

 

현재 오프셋 구하기

-long ftell(FILE *stream);

-위의 함수는 파일의 시작에서 부터 현재 위치의 오프셋까지의 바이트 수이다.

 

처음 위치로 오프셋 이동

-void rewind(FILE *stream);

파일의 시작으로 오프셋을 이동시킨다.

 

오프셋의 저장과 이동

-int fsetpos(FILE *stream, const fpos_t *pos); pos가 가르키는 영역의 값으로 파일 오프셋을 변경

-int fgetpos(FILE *stream, fpos_t *pos);  현재 오프셋을 pos가 가르키는 영역에 저장