C언어 : 파일 열기와 닫기

지환·2022년 1월 3일
0

C언어

목록 보기
11/37
post-thumbnail

파일 입출력 함수의 도우미 FILE 구조체

표준 입출력 라이브러리를 사용해 파일에 데이터를 저장하거나 읽는 방식이 존재한다. 표준 입출력 라이브러리는 'FILE 구조체'로 포인터 변수를 선언하고 파일 입출력 함수를 호출할 때마다 이 변수를 넘겨준다.

FILE *p_file;
fseek(p_file, 0, SEEK_SET);
  • fseek 함수를 호출하면, 프로그램에서 파일을 사용해며 기억해야 할 내부 상태 값을 p_file 파일 포인터에 저장한다.
  • FILE 구조체의 기본형은 FILE *변수 이름 형태다.
  • 'FILE 구조체로 선언한 포인터 변수'를 줄여서 파일 포인터로 부른다.
  1. 파일 열기 : fopen 함수

-파일 열기를 할 때는 사용할 '파일 이름'과 '파일을 어떤 형식으로 사용할 것인지'를 먼저 결정하고 fopen 함수를 사용하면 된다.

-fopen 함수는 두 가지 정보를 문자열 형식의 매개변수로 받아 처리한다.

  • 파일을 성공적으로 열면 FILE* 형식의 메모리 주소 값을 반환한다.

  • 만약 파일이 존재하지 않거나 파일 형식을 잘못 사용해서 파일 열기에 실패하면 NULL 값을 반환한다.



int main()
{
	FILE* p_file = fopen("tipssoft.dat", "r"); 
	// 프로그램 작업 경로에 해당 파일이 있는 경우에 읽기 모드(r)로 tipssoft.dat 파일을 연다.
	if (NULL != p_file)
	{
		//파일 열기에 성공한 경우
	}
	else {
	 // 파일 열기에 실패한 경우
	}


}
  • fopen 함수에 사용할 파일 이름은 문자열로 지정해야 한다. 시스템은 프로그램의 작업 경로(Working Directory, 파일이 실행된 경로)에서 해당 파일을 찾는다.
  • 예를 들어 c:\temp 경로에서 exam.exe 파일을 실행했다면 exam 프로그램의 작업 경로는 c:\temp다.
  • 그리고 작업 경로에서 fopen 함수에 사용한 tipssoft.dat 파일을 찾게 된다. 즉, c:\temp\tipssoft.dat 경로에서 파일을 찾는다.
  • 만약 사용할 파일이 현재 작업 경로에 없다면, 파일 이름을 표기할 때 경로까지 같이 표기하면 된다.
  1. 현재 작업 경로가 c:\temp인데 자신이 사용할 tips.dat 파일이 c:\tipssoft 경로에 있다면 "c:\tipssoft\tips.dat"라고 표기하면 된다.

파일 사용 형식을 알아보자

  • 파일 사용 형식이란 파일을 어떻게 사용할 것인지 지정하는 형식이다.
  1. 파일 읽기를 할 것인지
  2. 파일 쓰기를 할 것인지 정해야 된다.

먼저 파일이 다루는 속성에 따라 기본적으로 나누어지는 형식을 살펴보겠다. 이 두 가지 형식은 단독으로 쓸 수 없고 배우게 될 다른 형식과 함께 써야 된다.

파일 내용 읽기 모드 'r'

  • 이 형식은 파일의 내용을 읽기 위한 목적으로 파일을 연다.
  • 이 형식을 지정하여 fopen 함수를 사용했는데 파일이 없으면, 파일 열기에 실패하고 NULL 값을 반환한다. 바이너리 파일을 여는 경우에 다음과 같이 "rb"를 사용한다.
FILE *p_file = fopen("tips.dat", "rb"); 
// rb대신 r만 사용해도 된다.
  • 텍스트 파일을 열 떄는 다음과 같이 "rt"를 사용한다
FILE *p_file = fopen("tips.txt", "rt");

파일에 데이터 쓰기 모드 "w"

  • 이 형식을 사용하면 파일에 데이터를 쓰기 위한 목적으로 파일을 연다.
  • 만약 fopen 함수에 명시한 파일이 작업 경로에 없다면, 그 이름으로 만든 파일을 만든 후에 파일을 열기 때문에 "w"형식을 사용하면 파일 열기에 실패하지 않습니다.
  • 바이너리 파일을 여는 경우에 다음과 같이 "wb"를 사용한다.
FILE *p_file = fopen("tips.dat", "wb");
  • 텍스트 파일을 열 때는 다음과 같이 "wt"를 사용한다.
FILE *p_file = fopen("tips.txt", "wt");

파일에 데이터 이어 쓰기 모드 "a"

  • 파일에 데이터를 확장하기 위한 목적으로 파일을 연다.
  • 만약 fopen 함수에 명시한 파일이 직접 경로에 없다면, 그 이름으로 파일을 만든 후에 파일을 열기 떄문에 "a" 형식을 사용하면 파일 열기에 실패하지 않습니다.
  • 하지만 "w" 속성과 달리 기존에 파일이 존재하더라도 파일 내용을 지우지 않고 기존 파일 내용에 이어쓰기를 한다.
  • 바이너리 파일을 여는 경웅 다음과 같이 "ab"를 사용한다.
FILE "p_file = fopen("tips.dat", "ab"); //바이너리 파일
  • 텍스트 파일을 열 떄는 다음과 같이 "at"를 사용한다.
FILE *p_file = fopen("tips.txt", "at");

파일 사용 형식에서 읽기와 쓰기를 같이 사용하기.

  1. 읽기 강조 "r+"
  • 읽기와 쓰기를 같이 사용할 때 '읽기'를 더 강조하는 형식이다.
  • 이 형식은 파일을 열 때, 기존 파일이 없으면 파일을 새로 만들지 않고 파일 읽기에 실패한다.
  • 기존 파일이 있는 경우에는 해당 파일의 내용을 지우지는 않지만, 기존 데이터의 위치로 이동해서 해당 위치의 내용을 덮어쓸 수 있다.
  • 읽기 강조를 사용 할 떄,
  1. 바이너리 파일에 사용하는 경우에 "r+", "rb+", "r+b" 라고 쓰며,
  2. 텍스트 파일에 사용하는 경우에 "rt+" 또는 "r+t" 라고 쓴다.
  1. 쓰기 강조 "w+"
  • 읽기와 쓰기를 같이 사용할 떄, '쓰기'를 더 강조한다.
  • 이 형식은 파일을 여는 경우 기존 파일이 없으면 새로 파일을 만든다.
  • 파일이 이미 존재하면, 기존 파일의 내용을 모두 지우고 시작한다.
  1. 바이너리 파일에 사용하는 경우에 "w+", "wb+","w+b" 라고 쓸 수 있으며
  2. 텍스트 파일에 사용하는 경우 "wt+" 또는 "w+t"라고 쓴다.
  1. 읽기와 이어 쓰기를 같이 사용하기 "a+"
  • 읽기 모드와 이어 쓰기 모드를 같이 사용해야 하는 경우에 사용하며, '확장'을 더 강조하는 형식이다.
  • 확장을 더 강조하는 것은, 이 형식으로 파일을 여는 경우에 기존 파일이 없으면, 파일을 새로 만들고 파일이 존재하면 파일의 내용을 지우지 않고 기존 내용에 이어서 시작한다.
  • 하지만 "r+"와 달리 기존 데이터 위치로 이동할 수 있고, 읽기도 가능하지만 쓰기를 사용하면 현재 위치와 상관없이 파일의 끝에 내용이 추가된다.
  1. 바이너리 파일에 사용하는 경우에 "a+", "ab+", "a+b"라고 쓴다.
  2. 텍스트 파일에 사용하는 경우엔 "at+", "a+t"라고 쓴다.

참고 : 읽기와 쓰기를 같이 사용하려면 "r+"나 "w+"와 같이 적어야 하는데, "rw"라고 적기도 한다. 하지만 "rw"는 표준이 아니기 떄문에 컴파일러에 따라 "r+"나 "w+"로 자동 변환하거나 fopen 함수의 실행이 실패한다.

파일 닫기 : fclose 함수

  • fopen 함수를 사용하여 파일을 열어서 사용하다가 끝나면, fclose 함수를 사용해 파일을 닫아야 한다.

  • 파일을 닫지 않으면, 파일의 내용이 지워지거나 파일을 사용할 수 없는 상태가 된다.

  • 파일을 열지 않은 상태에서 파일 닫기를 시도하거나 이미 닫은 FILE *주소 로 파일 닫기를 다시 시도하면, 프로그램 실행에 오류가 발생할 수 있다.

	FILE* p_file = fopen("tipssoft.dat", "r+b"); //읽기 쓰기 모드로 바이너리 파일을 오픈한다.
	if (NULL != p_file)
	{
		fclose(p_file);
	}
	else {
	
	}

<출처 : DO IT C언어 - 김성엽>

profile
아는만큼보인다.

0개의 댓글