파일 입출력
- 표준 입출력 라이브러리는 'FILE 구조체'로 포인터 변수를 선언하고 함수를 호출할 때마다 이 변수를 넘겨주도록 만들어졌다.
FILE *p_file;
fseek(p_file, 0, SEEK_SET);
- fseek 함수를 호출하면, 프로그램에서 파일을 사용하고, 기억해야 할 내부 상태의 값을 p_file 파일 포인터에 저장한다.
파일 열기
- 파일 열기를 할 땐, 2가지를 결정해야 된다.
1-1) 사용할 파일 이름
1-2) 파일을 어떤 형식으로 사용할 것인지를 결정하고 fopen 함수를 사용하면 된다.
1-3) fopen 함수에 사용할 파일 이름은 문자열로 지정해야하고, 시스템은 작업 경로에서 해당 파일을 찾는다.
1-4) 만약에 c:\data 경로에서 exam.exe를 실행했다면, exam의 작업 경로는 c:\data다. 즉. c:\data\tipssoft.dat 경로에서 파일을 찾는다.
함수의 원형 : FILE *fopen(const char *filename, const char *mode)
함수 사용 형식 : fopen(사용할 파일 이름, 파일 사용 형식)
다음 예제를 보자.
FILE* p_file = fopen("tipssoft.dat", "r"); // 읽기모드 (r)
if (NULL != p_file) // 파일 열기에 성공한 경우
{
}
else // 파일 열기에 실패한 경우
{
}
- 사용할 파일이 현재 작업 경로에 없다면 ? 파일 이름을 표기할 때 경로까지 표기하면된다.
2-1) c:\data가 현재 작업 경로라면, "c:\\tipssoft\\tips.dat"
FILE* p_file = fopen("c:\\tipssoft\\tips.dat", "r");
if (NULL != p_file)
{
}else{
}
파일 사용 형식 알아보자.
1. t
- 텍스트 속성으로 파일을 사용함. 만약에 이 형식으로 바이너리 파일을 열면 파일 열기는 성공하지만, 파일 입출력 함수를 사용하면 오류가 발생한다.
- 왜냐하면 바이너리 파일은 파일의 실제 크기를 사용하고
텍스트 파일은 EOF(파일의 끝, End of file)라는 아스키 값을 사용해서 파일의 끝을 구별한다.
- 그래서 바이너리 파일을 텍스트 속성으로 열면 파일의 끝을 찾는 데 문제가 발생한다.
<텍스트 파일 열 때>
FILE *p_file = fopen("tips.txt","rt");
2. b
- 바이너리 속성의 파일을 사용한다는 뜻, 이 형식이 기본값이다. 형식을 지정할 땐 t 또는 b를 포함하고 있지 않다면 이 형식을 기본적으로 사용한다.
<바이너리 파일 열 때>
FILE *p_file = fopen("tips.dat","rb");
3. w
- 파일에 데이터 쓰기 모드를 의미한다.
- 이 형식을 사용하면 파일에 데이터 쓰기(write)위한 목적으로 파일이 열린다.
- 만약 fopen 함수에 명시한 파일이 작업 경로에 없다면, 그 이름으로 파일을 만든 후 파일을 열기 때문에 "w"형식을 사용하면 파일 열기에 실패하지 않는다.
- 같은 이름을 가진 파일이 이미 존재하는 경우는 파일을 열면서 파일이 갖고 있던 내용을 모두 지우고 시작하기 때문에 조심해야된다.
FILE *p_file = fopen("tips.dat", "wb"); //(wb == w)바이너리 파일
FILE *p_file = fopen("tips.txt", "wt"); // 텍스트 파일
4. a
- 파일에 데이터 이어 쓰기 모드다.
- 이 형식을 사용하면 append 하기 위한 목적으로 파일이 열린다.
- 이 형식도 동일하게 fopen 함수에 명시한 파일이 작업 경로에 없다면 "a"형식을 사용하면 파일 열기에 실패하지 않는다.
- "w"와 달리 "a"는 기존에 파일이 존재하더라도 파일 내용을 지우지 않고 기존 파일 내용에 이어쓰기를 한다.
FILE *p_file = fopen("tips.dat", "ab");
FILE *p_file = fopen("tips.txt", "at");
파일 사용 형식에서 읽기와 쓰기를 같이 사용한다면?
1. 읽기 강조 : "r+"
- 읽기와 쓰기를 같이 쓸 때 읽기를 더 강조하는 방법이다.
- 이 형식으로 파일을 열게되면, 기존 파일이 없으면 파일을 새로 만들지 않고 파일 읽기에 실패한다.
- 기존 파일이 있는 경우, 해당 파일의 내용을 지우지는 않는다. + 기존 데이터의 위치로 이동해서 덮어 쓸 수는 있다.
1. 바이너리 형식 : "r+" , "rb+"
2. 텍스트 형식 : "rt+", "r+t"
2. 쓰기 강조 : "w+"
- 읽기와 쓰기를 같이 사용할 때 쓰기를 더 강조하는 형식
- 기존 파일이 없으면 파일을 새로 만들고, 파일이 이미 존재하면 파일의 내용을 모두 지우고 사용한다.
1. 바이너리 형식 : "w+", "wb+"
2. 텍스트 형식 : "wt+", "w+t"
3. 읽기와 이어 쓰기를 같이 사용하는 "a+"
- 읽기 모드와 이어 쓰기 모드를 같이 사용할 때 사용한다. '확장'를 더 강조하는 형식이다.
- 확장을 더 강조한다는 뜻은, 이 형식으로 파일을 여는 경우에 기존 파일이 없으면 파일을 새로 만들고, 파일이 존재하면 파일의 내용을 지우지 않고 기존 내용에 이어서 시작한다는 뜻이다.
- "r"과 달리 기존 데이터 위치로 이동할 수 있고, 읽기도 가능하지만 쓰기를 사용하면 현재 위치와 상관없이 파일의 끝에 내용이 추가된다.
1. 바이너리 형식 : "a+", "ab+"
2. 텍스트 형식 : "at+", "a+t"라고 쓴다.
파일 닫기 : fclose 함수
- fopen으로 함수를 사용하면, fclose 함수를 사용하여 파일을 닫아야한다.
FILE *p_file = fopen("tipssoft.dat", "r+b");
if(NULL != p_file){
fclose(p_file);
}else{
}