1. 기본 구조
2. fopen함수
Interface | File * fopen(const char* filePath, const char* mode) |
Parameter |
filePath: 파일 경로 mode: 옵션이 되는 모드 |
Return |
Sucess: File Stream (FILE 구조체 변수의 주소 값) Fail: Null Pointer |
Option |
r: read mode (입력 stream) w: write mode (출력 stream) a: appendix mode (덧붙여 쓰기)
|
Function | 원하는 파일스트림을 생성하고 파일 디스크립터를 리턴한다. |
File 구조체의 포인터는 사실상 파일을 가리키는 'File Descriptor' 역할을 한다.
3. fclose함수
Interface | int * fclose(FILE *stream) |
Parameter |
stream: 열려있는 파일의 Stream |
Return |
0: success -1: fail >> EOF(End Of File) |
Function | 열려있는 File stream을 해제한다. |
4. fgets 함수
Interface | char *fgets(char * str, int size, FILE * stream) |
Parameter |
str: 입력된 버퍼 size: 읽어올 문자올 수 stream: 파일 포인터 |
Return |
지정된 파일의 문자열 |
Function | 파일포인터에 담긴 파일의 문자열 지정된 size만큼 읽어오는 함수 |
5. fputs 함수
Interface | int *fputs(const char * str, FILE * fp) |
Parameter |
str: 지정된 버퍼 fp: 지정된 파일 포인터
|
Return |
0 or 양수: Success -1 음수 : Fail (EOF) |
Function | 한줄의 문자열을 지정된 파일포인터가 가리키는 파일에 저장한다. |
6. FILE STREAM
예제에서 쓰이는
fputs, fputc => 파일에 '출력'("w") (write) // Output Stream
fgets, fgetc => 파일로부터 '입력'("r") (read) // Input Stream
gets, getc => 표준입력(stdin)으로부터 버퍼에 '입력'
puts, putc => 버퍼로부터 표준 '출력' (stdout)
7. 예제
7.1 예제2
다음 코드는 문제가있다.
data.txt 파일에 "A B C"라는 문자열을 넣고
ch라는 character 변수에 한문자씩 받아와 출력하는 코드므로
실행결과가 "A B C"가 나와야 하지만
아무 문자도 나오지 않는다.
※원인 ※
출력 스트림 fp1을 통해 "A B C"라는 문자열을 모두 data.txt에 쓰기도전에(fputs)
입력 스트림 fp2를 통해 data.txt 빈 상태의 문자들을 모두 읽어들였기 때문이다. (fgetc)
◆ 해결
문자열을 모두 출력버퍼를 통해 쓰고난 후 출력 파일 스트림(fp1)을 닫는다.
그 후에 입력버퍼를 통해 읽어들인다(fp2)
모든 문자열 입력후에 파일 스트림을 닫고나서
입력 스트림을 통해 읽어오면 된다.
8. 참고
fprintf, fscanf 등의 함수의 매개변수에서 파일 포인터 부분을 보면 FILE* const _Stream와 같이 스트림(stream)이라고 되어 있습니다. 보통 파일 포인터를 파일 스트림이라고도 하는데 스트림은 물 등의 액체가 흐르는 것을 뜻합니다. 파이프 속에 물이 계속 흘러다니는 것처럼 파일 스트림도 파일의 데이터를 연속적으로 처리한다고 해서 스트림입니다.
즉, 파일에서 데이터를 처리할 때마다 매번 파일을 여는 것이 아니라 파일 스트림을 한 번 생성해서 계속 데이터를 쓰거나 가져오는 방식이죠. 여기서 fopen으로 파일을 읽기 전용으로 열면 입력 스트림, 쓰기 전용으로 열면 출력 스트림, 읽기/쓰기로 열면 입출력 스트림입니다. 파일 모드에 따라 단방향, 양방향이 되죠. 마찬가지로 stdin은 입력 스트림, stdout, stderr는 출력 스트림입니다.
참고 출처: https://dojang.io/mod/page/view.php?id=608
'C > C' 카테고리의 다른 글
Dangling Pointer (feat. Memory Map) (0) | 2020.03.01 |
---|---|
main 함수 (feat. argc, argv) (0) | 2019.11.10 |
Memory Map 이해하기(Feat.성적처리 프로그램 소스) (0) | 2019.10.02 |
2차원 배열 이해 (0) | 2019.09.29 |
배열 초기화 사소한 Tip (0) | 2019.09.26 |