- 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("비정상");
'▸C언어 > 기본함수 및 구현식' 카테고리의 다른 글
string.h_strcat, strncat_문자열 합치기 (구현식 포함) (2) | 2020.01.15 |
---|---|
string.h_strlen_문자열 길이 구하기 (구현식 포함) (2) | 2020.01.15 |
string.h_strtok_문자열 나누기 (구현식 포함) (0) | 2019.12.05 |
string.h_strcmp, strcnmp_문자열 비교 (구현식 포함) (0) | 2019.12.05 |
댓글