4-4 File IO - lib 함수 (학습)

do·2022년 4월 21일
0

API

목록 보기
23/42

Chapter 5(132-154) Standard I/O Library

  • Any buffered output data is flushed before the file is closed. Any input data that may be buffered is discarded. If the standard I/O library had automatically allocated a buffer for the stream, that buffer is released. When a process terminates normally, all standard I/O streams with unwritten buffered data are flushed, and all open standard I/O streams are closed.
    비정상 종료 -> 버퍼 flush 안될수도 있음

시스템 콜과 라이브러리 차이

  • lib 함수(fread, fwrite)의 경우, 내부적으로 버퍼에 데이터를 쌓았다가 일정 크기 이상이 되면 read, write를 실행함.
  • lib call은 system call의 호출 빈도가 적고, 최적화를 알아서 해줌
  • (p122) The goal of the buffering provided by the standard I/O library is to use the minimum number of read and write calls. 콜 적게하고
  • less amount of CPU time required to perform I/O . 적은 CPU이용률
  • Also, it tries to do its buffering automatically for each I/O stream, obviating the need for the application to worry about it. 자동으로 버퍼처리하고 디스크에 저장함 (버퍼가 가득 차거나, 운영체제가 판단해서 실제 하드디스크에다 저장해도 될 시점이면)
  • 다만 버퍼 때문에 까다로움

File Stream

스트림: 프로그램을 드나드는 데이터의 흐름

  • 데이터의 입출력 처리의 중간자 역할
  • 음성, 영상, 데이터 등의 작은 조각들이 하나의 줄기를 이루며 전송되는 데이터 열
    파일에 데이터를 쓰고싶다고 하면, 파일 스트림을 찾아 목표지점으로 삼는다.
    목표지점이란, 입력스트림의 경우 데이터가 위치하는 곳을 말하고, 출력스트림의 경우 데이터가 저장될 곳을 말한다.

사용자 입장에서 데이터가 들어오면 입력스트림이고, 데이터가 나가면 출력스트림이다.

  • 입력스트림은 데이터를 스트림으로 읽어들이고, 스트림에 존재하는 데이터를 하나하나 읽는다.
  • 출력스트림은 출력된 데이터를 스트림으로 보내고, 스트림에 있는 데이터를 비워버린다. 비워진 데이터는 모두 목표지점에 저장된다.

1. fopen()

함수 원형. FILE* fopen(const char* filename, const char* type)
기능. filename이 지정한 파일을 엽니다.
파일이 존재하면 파일 내용을 삭제하고 fopen() 하기 때문에, 존재하는 파일에 대해서 에러처리 하기 위해 fopen()을 사용하면 안 됩니다.
헤더. <stdio.h>
매개변수1. const char* filename 파일명
매개변수2. const char* type 파일 타입
15가지로 나뉨
r rb open for reading
w wb truncate to 0 length or create for writing
a ab append; open for writing at end of file, or create for writing
r+ r+b rb+ open for reading and writing
w+ w+b wb+ truncate to 0 length or create for reading and writing
a+ a+b ab+ open or create for reading and writing at end of file
b는 binary파일과 text파일을 구분하기 위해 있음
근데 유닉스 커널은 두개의 파일을 따로 구별짓지 않기 때문에 b는 의미 없음
리턴. FILE* 열린 파일을 가리키는 포인터
errno. EINVAL (mode provided to fopen() was invalid)
기타. fdopen()은 파일이 존재해도 파일 내용을 삭제하지 않음. (O_TRUNC 플래그가 없을때)

2. fread()

함수 원형. size_t fread(void* buffer, size_t size, size_t count, FILE* stream)
기능. 항목 읽기
stream에서 size길이의 count항목까지 읽고, 지정된 buffer에 저장합니다. 파일의 위치는 읽은 바이트의 수만큼 증가합니다.
헤더. <stdio.h>
매개변수1. void* buffer
매개변수2. size_t size
매개변수3. size_t count
매개변수4. FILE* stream
리턴. 읽기에 성공한 전체 항목의 수를 리턴함.
오류가 발생하거나 count에 도달하기 전에 파일 끝이면 count보다 적을 수 있음
size 또는 count가 0이면 fread() 함수는 0을 리턴하고 배열의 목차와 스트림의 상태가 변화없이 지속됩니다.

3. fgets()

함수 원형. char* fgets(char* string, int n, FILE* stream)
기능. 스트링 읽기
현재 stream 위치에서 어느 것이 먼저 오건 첫번째 \n까지, 스트링의 끝까지, 또는 읽은 문자 수가 n-1과 같을 때까지 문자를 읽습니다. fgets() 함수는 string에 저장하고, 스트링 끝에 널문자를 추가합니다.
string은 줄 바꾸기 문자를 포함합니다(읽은 경우). n이 1이면 string이 비어있습니다.
헤더. <stdio.h>
매개변수1. char* string
매개변수2. int n
매개변수3. FILE* stream
리턴. (성공) string 버퍼를 가리키는 포인터를 리턴
(NULL) 오류 또는 파일의 끝 조건
errno.
EBADF ECONVERT ENOTREAD EGETANDPUT ERECIO ESDTIN EIOERROR EIORECERR

4. fgetc()

함수 원형. int fgetc(FILE* stream)
기능. 문자 읽기
현재 위치의 입력 stream에서 하나의 비부호화 문자를 일고 다음 문자를 가리키도록 연관된 파일 포인터(있는 경우)를 증가시킵니다.
getchargetc(stdin)는 같음
헤더. <stdio.h>
매개변수1. FILE* stream
리턴. return the character read as an unsigned char cast to an int
에러 또는 EOF일 떄 같은 값을 리턴함. 구분하려면 ferror()나 feof() 사용해야함 (p129)
errno.
EBADF ECONVERT ENOTREAD EGETANDPUT ERECIO ESDTIN EIOERROR EIORECERR
예시.

const char* filename = "./fputc.txt";
FILE* fp = fopen(filename, "r");
while (1) {
	char c = getc(fp);
    if (c == EOF) { break; }
    fputc(c, stdout); //== printf("%c", c);
}
fclose(fp);

5. fprintf()

함수 원형. int fprinf(FILE* stream, const char* format-string, argumnet-list)
기능. 스트림에 형식화된 데이터 쓰기
argument-list의 각 항목(있는 경우)을 변환하고 format-string의 해당 형식 스펙에 따라 스트림에 씁니다.
헤더. <stdio.h>
매개변수1. FILE* stream
매개변수2. const char* format-string
매개변수3. argument-list
리턴. 출력 오류가 발생하면 인쇄되거나 음수 값인 바이트 수를 리턴
errno. printf() errno와 동일
EBADMODE ECONVERT EIOERROR EIORECERR EILSEQ EPUTANDGET ESTDOUT

6. fwrite()

함수 원형. size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream)
기능. 항목 쓰기
헤더. <stdio.h>
매개변수1. const void* buffer
매개변수2. size_t size
매개변수3. size_t count
매개변수4. FILE* stream
리턴. (성공) 전체 항목 수 리턴
(오류) count보다 적음
errno.
ECONVERT ENOTWRITE EPAD EPUTANDGET ESTDERR ESTDIN ESTDOUT ETRUNC EIOERROR EIORECERR

7. fputs()

함수 원형. int fputs(const char* string, FILE* stream)
기능. 스트링 쓰기
string을 현재 위치의 출력 stream으로 복사함. 스트링 끝의 널문자를 복사하지 않음
헤더. <stdio.h>
매개변수1. const char* string
매개변수2. FILE* stream
리턴. (성공) 음수가 아닌 값 리턴
(오류) EOF 리턴
errno.

8. fputc()

함수 원형. int fputc(int c, FILE* stream)
기능. 문자 쓰기
c를 unsigned char로 변환한 다음 c를 현재 위치의 출력 스트림으로 작성하여 그에 맞게 파일 위치를 변경합니다. 스트림이 추가 모드 중 하나로 열리면, 문자는 스트림의 끝에 추가됩니다.
putc()와 동일하게 항상 함수 호출로 정의되며, 매크로로 대체되지 않습니다.
헤더. <stdio.h>
매개변수1. int c
매개변수2. FILE* stream
리턴. (성공) 작성되는 문자를 리턴
(오류) EOF
errno.
ECONVERT, ENOTWRITE, EPUTANDGET, ERECIO, ESTDERR, ESTDOUT, EIOERROR, EIORECERR
예시.

const char* filename = "./fputc.txt";
FILE* fp = fopen(filename, "r");
char arr[10] = "\nHello.\n";
int i = 0;
while (1) {
	char c = arr[i];
    if (c == '\0') { break; }
    fputc(c, fp);
    ++i;
}
fclose(fp);

9. fscanf()

함수 원형. int fscanf(FILE* stream, const char* format-string, argument-list)
기능. 형식화된 데이터 읽기
지정된 stream의 현재 위치에서 argument-list의 항목에서 지정된 위치로 데이터를 읽습니다. argument-list의 각 항목은 format-string의 양식 지정자에 해당되는 유형의 변수에 대한 포인터여야 합니다.
헤더. <stdio.h>
매개변수1. FILE* stream
매개변수2. const char* format-string
매개변수3. argument-list
리턴. fscanf() 함수는 성공적으로 변환하고 지정되는 필드의 수를 리턴합니다. 리턴값은 fscanf() 함수를 읽지만, 지정되지 않은 필드를 포함하지 않습니다.
변환 전에 입력이 실패하거나 성공한 경우 입력 항목의 수가 지정되면 리턴값은 EOF입니다.

10. fflush()

함수 원형. int fflush(FILE* stream)
기능. 파일에 버퍼 쓰기
시스템이 지정된 출력stream과 관련된 버퍼를 비우게 합니다.
stream이 입력을 위해 열려 있는 경우 fflush() 함수는 ungetc() 함수의 효과를 실행취소합니다. stream은 호출 후에 계속 열려 있습니다.
stream이 NULL이면 시스템은 출력스트림을 모두 비웁니다.
(스트림을 닫거나, 스트림을 닫지 않고 프로그램이 정상적으로 종료되면 시스템이 버퍼를 자동으로 삭제함)
헤더. <stdio.h>
매개변수1. FILE* stream
리턴. 0 - 버퍼 삭제
EOF - 오류
errno.
ENOTOPEN ERECIO ESTDIN EIOERROR EIORECERR

11. fseek()

함수 원형. int fseek(FILE* stream, long int offset, int origin)
기능. 파일 위치 변경
stream과 연관된 현재 파일 위치를 파일 내 새 위치로 변경합니다. stream에서의 다음 연산은 새 위치에서 발생합니다.
SEEK_SET, SEEK_CUR, SEEK_END
헤더. <stdio.h>
매개변수1. FILE* stream
매개변수2. long int offset
매개변수3. int origin
리턴. 0 - 성공적으로 포인터를 움직임
0이 아닌 리턴값 - 오류
errno.
EBADF EBADSEEK ENODEV ENOTOPEN ERECIO ESTDERR ESTDIN ESTDOUT EIOERROR EIORECERR

12. fclose()

함수 원형. int fclose(FILE* stream)
기능. 스트림 닫기
stream이 가리키는 스트림을 닫습니다. 이 함수는 닫기 전에 스트림과 연관된 버퍼를 모두 삭제합니다. 스트림을 닫을 때 이 함수는 시스템이 예약한 버퍼를 해제합니다.
헤더. <stdio.h>
매개변수1. FILE* stream
리턴. 0 - 스트림을 성공적으로 닫음
EOF - 오류
errno.
ENOTOPEN EIOERROR EIORECERR ESCANFAILURE

0개의 댓글