C언어: 파일 입출력
표준 입출력 (scanf
, printf
) ->일반화 -> 파일 입출력
FILE*
(파일포인터) 타입 변수를 이용
FILE* file = fopen("파일명", "권한"); // 파일 열기, (권한 : `r`,`w`,`a`=append)
권한에는 b
나 t
접미사를 붙일 수 있다. (b
=binary, t
= text)
ex) rb
, rt
주의: 접미사를 붙이지 않으면 text가 기본값이다.
fclose(FILE* ); // 파일 닫기
입력 - fgetc
, fegets
, fscanf
출력 - fputc
, fputs
, fprintf
char fgetc(FILE* )
char* fgets(char* array,int length,FILE* filePointer)
-
fgets()
filePointer
가 가리키는 파일로부터length
글자(null문자 포함!!!!!!!!!!!!!!! 즉,length-1
글자만큼의 실제 문자열을 읽고,length
번째에'\0'
을 삽입한다.)를 읽어 array 포인터가 가리키는 곳에 문자열의 형태로 저장한다.
주의: 처음 등장한 줄바꿈 문자까지만 저장한다. 줄바꿈 문자가 포함된다! (gets
처럼 줄바꿈을 끝으로 인식한다.)
fscanf(FILE* filePointer, "문자열", ...)
scanf
의 파일 버전. 맨 앞 파일 포인터만 추가되었다고 보면 된다. (stdin대신 file stream으로 입력을 받나?)
fprintf(FILE* 출력할 스트림, "문자열", ...)
fputs("문자열", FILE* filePointer) // 문자열을 파일포인터가 가리키는 곳에 삽입한다.
argument로 전달 가능한 FILE*
형은 파일 포인터뿐만 아니라 표준 스트림도 해당된다.
feof(FILE*) // EOF인지 체크 (사용에 주의)
EOF: 문자열에서의 ‘\0’ 과 유사하다. 파일의 끝을 나타낸다.
파일의 문자열을 입력받을때 EOF인지 check하는 구문을 사용 가능하다.
There is a wide spread misunderstanding of how C’s
feof()
function works. Many programmers use it like Pascal’seof()
function. However, C’s function works differently!
What’s the difference? Pascal’s function returns true if the next read will fail because of end of file. C’s function returns true if the last function failed.
많은 프로그래머들이 C의 feof()
함수를 Pascal의 eof()
처럼 사용하지만, C의 feof()
는 파스칼의 그것과 같은 방식으로 작동하지 않습니다. 차이점이 뭘까요?
파스칼의 eof
는 ‘다음’에 읽어오는 부분이 파일의 끝이라 실패하는 경우에 true
를 리턴합니다.
반면 C의 feof
는 ‘마지막’ 함수가 실패하는 경우에 true
를 리턴합니다.
(즉, C에서는 파일 포인터가 끝을 가리켜도 함수는 한 번 더 실행이 되고, 거기서 에러가 나와야 true
가 되어서 while
을 빠져 나온다는 말.)
ex)
ch != EOF
FILE* fp = fopen("hello.txt", "r"); // hello.txt 파일을 r권한으로 읽기
fgetc(fp); // fp가 가리키는 파일의 문자를 읽고 파일포인터를 1 증가.
size_t fread (void * DstBuf, size_t ElementSize, size_t Count, FILE * FileStream);
DstBuf
: 저장할 버퍼의 주소
ElementSize
: 원소 ‘1개’의 크기
Count
: 입력받을 원소의 개수
FileStream
: 파일 스트림
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
ptr
- Pointer to the array of elements to be written, converted to aconst void*
.
size
- Size in bytes of each element to be written.size_t
is an unsigned integral type.
count
- Number of elements, each one with a size ofsize
bytes.size_t
is an unsigned integral type.
stream
- Pointer to aFILE
object that specifies an output stream.
size_t fread(void* ptr, size_t size, size_t count, FILE* stream);
-> ptr
이 가리키는 버퍼에 size
크기의 원소 count
개를 stream
으로부터 읽어서 저장함