▸C언어/기본함수 및 구현식

stdio.h_파일제어 (fopen, fopen_s, fclose)

코데방 2019. 12. 5.
728x90
  • fopen : 파일을 열어줌
  • fclose : 파일을 닫아줌
  • fopen_s : 파일을 열어줌 (C11 이후)

 


 

[ fopen ]

  • 파일을 연다는 의미는 디스크에 저장된 파일 내용을 메모리에 올린다는 의미
  • 메모리에 올라온 파일 내용의 첫 주소를 반환해줌 (FILE 타입 포인터 변수에 저장하면 됨)
  • 주소를 직접 찍어주거나 파일 이름만 넣을 경우 기본 위치에서 가져옴
  • exe파일로 직접 실행할 때는 해당 파일이 있는 위치가 기본 위치
  • 소스 파일로 IDE(비주얼 스튜디오)에서 실행할경우 해당 소스 파일 위치가 기본 위치
  • IDE에 따라 기본 위치는 다를 수 있음
	FILE* fp = fopen("파일이름.txt", "모드");

r

읽기

- 파일 없으면 NULL값 반환

w

쓰기

- 파일 없으면 새로 생성

- 파일 있으면 내용 다 지우고 새로 만듦

- 여는 순간 파일 내용 다 날아감

a

추가

- 파일 없으면 새로 생성

- 파일 있으면 내용 그대로 두고 뒤에 추가로 쓰게 됨

r+

읽기/쓰기

- 파일 없으면 NULL값 반환

- 파일 있어도 내용 그대로 놔둠

- 파일의 끝(EOF)이후부터만 쓸 수 있음, 기존 문자는 전혀 건드리지 않음

- 'a'가 하나 있는데 'fgz'를 입력하면 'agz'로 파일이 수정됨

- 'ab'가 있는데 'fgz'를 입력하면 'abz'로 파일이 수정됨

- 'ab'가 있는 fgetc(fp)로 하나 읽은 후 입력하면 'abgz'로 파일이 수정됨

- 즉, 현재 fp 위치 기준으로 쓰되 파일 마지막 위치부터만 쓰고 그 이전은 무시

w+

읽기/쓰기

- 파일 없으면 새로 생성

- 파일 있으면 내용 다 지우고 새로 만듦

- 여는 순간 파일 내용 다 날아감

- 아무리 해봐도 w모드와 다른점을 찾지 못하겠음..

a+

읽기/추가

- 파일 없으면 새로 생성

- 파일 있어도 내용은 그대로 놔둠

- 쓰기를 먼저하면 가장 뒷부분(EOF)부터 시작함

- 읽기를 먼저해서 포인터 위치가 바뀌면 그 부분부터 시작해서 r+과 동일하게 작동

파일 포인터의 위치를 적절히 잘 바꿔주지 않으면 +모드들은 쓰기가 매우 까다로워 보이네요. 아무리 해봐도 +모드들은 어떻게 사용하라고 만든건지를 잘 모르겠습니다..

 

 


 

[ fclose ]

  • 파일을 열었으면 닫아주기 전까지 파일 내용이 메모리에 상주하고 있음
  • 작업한 뒤 프로그램이 바로 종료되지 않는 한, 파일을 닫아줘야 메모리 누수가 생기지 않음
  • malloc으로 힙 메모리 동적할당 받은 뒤 free 시켜주는 것과 같음

 


 

[ fopen_s ]

  • 전처리기에 '#define _CRT_SECURE_NO_WARNINGS 해주지 않으면 컴파일 에러가 남(VS기준)
  • C11 표준 이후 부터는 입출력 함수에 다 _s를 붙여서 사용하라고 경고가 뜸
  • 즉, FILE 포인터 변수를 하나 만들고 거기다가 직접 집어넣어주는 구조
FILE* fp;
	fopen_s(&fp, "test.txt", "w");

 

  • 만약 파일이 열리지 않을 경우를 대비하고 싶다면 아래와 같이 써줌
  • 만약 파일이 열리지 않을 경우 fp의 값은 NULL이 됨 (그냥 fopen() 함수도 같음)
	FILE* fp = NULL;
	fopen_s(&fp, "test.txt", "r");
	
	if (fp != NULL)
	{
		char str[] = "abc";
		fprintf(fp, "%s", str);
	}
	else
		puts("비정상");

 

728x90

댓글

💲 추천 글