POST

C언어 파일 입출력 - 스트림(Stream)의 형성과 fopen함수

스트림이란(Stream)

쉽게말해 사용자가 구현하려는 프로그램(Program)에서 파일(File)을 사용하기위해서는 

파일(File)과 프로그램(Program)사이에 다리(Bridge)를 놓아야하는데 이 다리(Bridge)를 스트림(Stream)이라 한다.


하지만 실제로 다리가 놓이는 것은 아니며 스트림이 형성이 되었다고 한다면 이렇게 이해를 하면 좋을것 같다.

" 파일로부터 데이터를 읽어 들일(파일에 데이터를 쓸) 기본적인 준비가 완료 되었다 "

그리고 알아두어야 할 점은 운영체제가 파일의 구조를 결정하고 관리하기에 스트림의 형성도 운영체제가 해준다.


#include<stdio.h>

FILE * fopen(const char * filename, const char * mode);

- 성공 시 해당 파일의 FILE 구조체 변수의 주소 값, 실패 시 NULL값 포인터로 반환

fopen 함수호출을 통한 파일과의 스트림 형성과 FILE구조체

fopen함수는 프로그램상에서 파일과의 스트림을 형성할수 있다.


FILE은 FILE이라는 기본자료형이 존재하지 않으므로 FILE은 구조체의 이름이다.

하지만 굳이 FILE구조체가 어떻게 정의 되어 있는지는 알필요는 없다.


단지 fopen함수가 반환하는 FILE구조체의 포인터는  파일을 가리키기 위한 용도로 사용되며,

fopen함수가 호출되면 FILE구조체 변수가 생성된다.


fopen함수 작성시 첫번째 인자에는 스트림을 형성할 파일의 이름을 입력하고 

두번째 인자에는 형성할 스트림의 종류에 대한 정보를 문자열 형태로 전달한다.


#include<stdio.h>


int main(void)

{

FILE * fp1 // FILE구조체의 포인터 = fp1

= fopen("fin.dat", ...); // 생성된 FILE구조체 변수에 fin.dat 관련 정보로 채워짐

FILE * fp2 // FILE구조체의 포인터 = fp2

= fopen("egn.dat", ...); // 생성된 FILE구조체 변수에 egn.dat 관련 정보로 채워짐


. . . . . .

}

대략 위의 코드가 있다고 하자.

저기서 포인터fp1,fp2는 각각의 FILE구조체변수와 해당파일들을 가리키며,

fp1과 fp2를 활용하여 파일에 접근할 수 있다.


위에서 대충 파일과 스트림 형성을 했다면 이제 입력과 출력을 하는 방법을 살펴보자.


위에서 설명했다 시피 fopen함수의 첫번째 인자에는 스트림을 형성할 파일의 이름을 입력하고 

두번째 인자에는 형성할 스트림의 종류에 대한 정보를 문자열 형태로 전달한다고 하였다.


여기서 이 두번째 인자에 무엇을 입력 하여야 입력과 출력이 되는지 알아보자.


FILE *fp = fopen("data.txt","wt");

위의 코드를 보면 뒤에 스트림의 종류가 문자열 형태로 "wt"라고 쓰여져 있다.

이코드를 해석하면 "파일 data.txt 와 스트림을 형성하되 wt모드로 스트림을 형성한다." 라고 할수 있다.

그러면 wt모드는 무엇인가? 

wt모드는 해당파일에 데이터를 쓰기위한 출력스트림이다.(프로그램에서 파일로 데이터를 출력)


그리고 파일에서 데이터를 읽어 오기위한 스트림 종류는 어떤것일까? 아래의 코드를 보자.

FILE *fp = fopen("data.txt","rt");

"rt"라고 쓰여진것이 보일것이다. 

rt모드는 파일로 부터 데이터를 읽어오기 위한 입력스트림이다.


이제 완벽하게 기본적인 스트림을 형성할 수 있을 것이다. 우리는 이것을 '파일(file)이 개방(오픈(open))되었다.'고 한다.


포인터의 개념 - 바로가기