happy coding

[c] 파일 입출력 본문

self study/언어의 기본부터

[c] 파일 입출력

yeoonii 2022. 11. 27. 20:07
TCP school 을 보고 정리한 내용입니다.

파일(file)

파일이란 의미있는 정보를 담고 있으며, 이름을 가지고 있는 저장 장치 상의 논리적인 단위를 의미한다. C언어에서는 이러한 파일을 바이트별로 따로 읽을 수 있는 연속적인 바이트의 집합으로 취급한다.

파일의 종류

1. 바이너리 파일(binary file) 2. 텍스트 파일(text file)

1. 바이너리 파일은 데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩된 파일을 가리킨다. 프로그램이 이 파일의 데이터를 읽거나 쓸 때는 데이터의 어떠한 변환도 일어나지 않는다.

2. 텍스트 파일은 사람이 알아볼 수 있는 문자열로 이루어진 파일을 가리킨다. 프로그램이 이 파일의 데이터를 읽거나 쓸 때는 포맷 형식에 따라 데이터의 변환이 일어난다.

파일의 입출력

C언어에서 콘솔 장치에 대한 스트림은 프로그램 실행 시 자동으로 생성되며, 프로그램 종료 시 자동으로 소멸하는데, 파일과의 연결을 위한 스트림은 사용자가 직접 생성하고 소멸시켜야 한다.

C언어에서 파일에 대한 입출력 동작은 1. 파일과의 스트림 생성 2. FILE 구조체 변수의 포인터를 이용한 작업 진행 3. 파일과의 스트림 종결 이라는 순서에 따라 진행된다.

fopen() 함수

이 함수는 파일을 열어주는 함수이다. 파일을 연다는 것은 파일과의 입출력을 위한 스트림을 생성한다는 의미이다.

#include <stdio.h>
FILE *fopen (const char * restrict filename, const char * restrict mode);

fopen() 함수의 원형에서 첫 번째 인수는 열고자 하는 파일의 이름과 그 경로를 가지고 있는 문자열이다. 두 번째 인수는 파일을 여는 데 사용할 모드를 지정하는 문자열이다. 모드 문자열은 파일의 사용 용도를 결정하는 문자열과 파일의 데이터를 어떤 방식으로 입출력할지 결정하는 문자열로 구성된다.

모드 문자열

fopen() 함수는 파일을 여는 데 사용할 모드 문자열을 두 번째 인수로 전달받는데, 이 모드 문자열은 파일의 사용 용도를 결정하고, 파일의 데이터를 어떤 방식으로 입출력할지를 결정한다. 

파일의 사용 용도를 결정하는 데 사용할 수 있는 모드 문자열은 1. r (read mode) : 읽기 전용 모드 2. w (write mode) : 쓰기 전용 모드 3. a (append mode) : 추가 모드 이다.

파일의 데이터를 어떤 방식으로 입출력할지를 결정하는 데 사용할 수 있는 모드 문자열은 1. t (text mode) : 해당 파일의 데이터를 텍스트 파일로 인식하고 입출력한다. 2. b (binary mode) : 해당 파일의 데이터를 바이너리 파일로 인식하고 입출력한다. 이다.

또한, 추가적으로 1. x (exclusive mode) : 열고자 하는 파일이 이미 존재하면 파일 개방에 실패한다. 2. + (update mode) : 파일을 읽을 수도 있고 쓸 수도 있는 모드. 가 있다.

r 파일을 오로지 읽는 것만 가능한 텍스트 모드로 개방함.
w 파일을 쓰는 것만이 가능한 텍스트 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.
wx 파일을 쓰는 것만이 가능한 텍스트 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.
a 파일을 쓰는 것만이 가능한 텍스트 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.
rb 파일을 오로지 읽는 것만 가능한 바이너리 모드로 개방함.
wb 파일을 쓰는 것만이 가능한 바이너리 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.
wbx 파일을 쓰는 것만이 가능한 바이너리 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.
ab 파일을 쓰는 것만이 가능한 바이너리 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.
r+ 파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.
w+ 파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.
w+x 파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.
a+ 파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.
읽기는 전체를 읽을 수 있지만, 쓰기는 파일의 맨 끝에만 추가할 수 있음.
r+b 또는 rb+ 파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.
w+b 또는 wb+ 파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.
w+bx 또는 wb+x 파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.
a+b 또는 ab+ 파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.
파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.

프로그램이 성공적으로 파일을 열면, fopen() 함수는 FILE 구조체 변수의 포인터를 반환한다. 만약 열 수 없다면, fopen() 함수는 널 포인터를 반환한다.

FILE 구조체 변수의 포인터

이 포인터는 해당 파일이 사용하는 버퍼 정보를 비롯한 파일에 관한 정보가 들어있는 데이터를 가리킨다. 따라서 모든 파일 입출력 함수는 FILE 구조체 변수의 포인터를 인수로 전달받아 해당 파일에 접근한다.

fclose() 함수

fclose() 함수는 파일을 닫아주는 함수이다. 파일을 닫는다는 것은 파일과의 입출력을 위해 생성한 스트림을 소멸시키는 것을 의미한다. 즉, 버퍼에 남아있는 데이터를 파일로 완전히 내보내고, 파일 입출력을 위해 내부적으로 생성했던 FILE 구조체를 해제한다. C언어에서 다 사용한 파일은 반드시 fclose() 함수를 사용해 닫아줘야 한다.

#include <stdio.h>
int fclose(FILE *stream);	//함수의 원형

이 함수는 인수로 닫고자 하는 파일을 가리키는 FILE 구조체 변수의 포인터를 전달받는다. 성공적으로 닫는다면 0을 반환하고, 해당 파일을 닫지 못했다면 EOF를 반환한다.

'self study > 언어의 기본부터' 카테고리의 다른 글

[c] 선행처리기  (0) 2022.11.27
[c] 파일 입출력 함수  (0) 2022.11.27
[c] 콘솔 입출력  (0) 2022.11.27
[c] 공용체와 열거체  (0) 2022.11.27
[c] 구조체의 활용  (0) 2022.11.27
Comments