c언어 fopen 함수 : 파일을 연다.

코딩/C 2020. 2. 3. 18:08

 안녕하세요. 포인터에 대해 다 끝났으니, 파일을 가지고 천천히 놀아보도록 하겠습니다. 이 포스팅에서는 파일을 잘 여는 방법만 익히시면 됩니다.

  file_name과, mode를 넘겨주면, FILE 구조체의 포인터를 리턴합니다. 그러면 파일을 열고, 그것을 스트림과 연관을 시킨다고 링크에서는 설명을 하고 있습니다. 스트림, 버퍼. 벌써부터 어질어질해 집니다. 이에 대한 것들은 후에, 작성하도록 하겠습니다. 리턴을 하는 게 FILE 포인터인데요. 만약에 파일을 여는 것을 실패했다면, NULL 포인터를 리턴합니다. 이 처리를 잘 해주시면 좋을 듯 싶습니다. 열지도 못했는데 내용을 읽지는 못할 거니까요.

 

 

 일단, 이 포스팅에서는 3개만 알고 계시면 됩니다. 그리고 뒤에 +가 붙는 경우가 있어요.

 

 추가로 binary file을 열어야 하는 경우에, 뒤에 b 옵션을 붙여야 한다는 정도만 알고 가셔도 됩니다. 예를 들어, rb+는 read, write 하는 모드로 바이너리 파일을 여는 것을 의미합니다.  하나 주의해야 할 건 w 모드로 열었을 때, 내용이 모두 삭제된다는 것입니다.

 


 fopen이 성공하면 FILE 포인터를 리턴한다고 했으니까. FILE 구조체에 어떤 내용이 있는지 간략하게 봅시다.

 

 stdio.h를 보면, bits/types 라는 키워드가 보입니다. 여기에 FILE 구조체가 정의되었을 거 같네요. bits/types의 폴더에 들어가서, 여러 .h 파일들을 뒤져 봅시다.

 

 그러면, _IO_FILE을 FILE로 typedef를 했다는 것을 알 수 있어요. 그러면 _IO_FILE이 정의된 .h 파일을 찾아봐야 겠군요.

 

 

 찾아서 보겠습니다. 그러면, 무엇인지는 모르겠지만, 읽기를 위한 무언가. 쓰기를 위한 무언가, 등등을 저장하고 있음을 알 수 있어요. 보통 base를 기준점, end를 끝점, ptr을 현재 포인트 하고 있는 위치로 많이 변수명으로 한다는 것을 생각해 본다면, _IO_read_ptr이라던지, _IO_write_end가 어떤 것을 가리키는지 몰라도, 이걸 통해서 어떤 일을 하시는 지 감이 오실 겁니다.

 

 

 fileno라던지, lock과 같은 것도 저장하고 있어요. 대략적으로 봐도 파일을 관리하기 위한 구조라는 것을 알 수 있어요. 자세한 건 나중에 하나씩 보기로 합시다. 어찌 되었던, fopen 함수를 호출해서, FILE 포인터가 리턴이 되었다면, 리턴된 FILE 포인터를 이용해서 파일을 다룰 수 있는 게 핵심입니다.

 

 한 번 간단하게 다뤄보도록 하겠습니다.

 


 먼저, 1.txt를 w 모드로 열겠습니다.  다음에 fprintf 함수를 호출합니다. 1번째 인자를 fp, 즉, "1.txt"의 무언가와 연관이 된 파일 포인터를 넣습니다. 다음에, 2번째 인자에 "Hello\n"를 넣습니다. 그리고 fp와 연관된 파일을 fclose를 호출해서 닫습니다. 실행 결과가 어떻게 나올까요?

 

 

 "Hello"가 나옵니다. 파일에 있는 내용도 읽어 봅시다.

 

 

 mode를 "r"로 바꾸겠습니다. 나머지는 모두 같습니다. 다만, 1.txt에 있는 "Hello" 라는 것을 읽기 위해서, fscanf를 썼습니다. 이것 역시 1번째 인자가 파일 포인터입니다. "1.txt"와 연관된 무언가를 넣습니다. 이 파일에서 "Hello"라는 내용을 읽어내서, str에 넣습니다.

 

 

 출력 결과는 위와 같습니다.