19. 파일 입출력
19-1 표준 입출력 라이브러리
19-2 텍스트 파일과 바이너리 파일
컴퓨터는 모든 것을 숫자로 저장하는데,
숫자를 숫자 그대로 해석하겠다 - binary
숫자를 문자열 (ASCII와 같은)로 해석하겠다 - string
데이터 자체가 변경되는 것이 아니라 데이터를 해석하는 개념이 달라지는 것으로 개발 상황에 맞게 잘 판단해서 사용할 것
binary
- 메모리에 얼마나 저장되어 있는가? (sizeof연산자
)binary
- 저장되어 있는 변수를 다른 변수의 메모리 공간으로 복사 (memcpy 함수
)
string
- 변수에 얼마만큼의 길이로 문자열이 저장되어 있는가? (strlen함수
)string
- 저장되어 있는 문자열을 다른 변수의 문자열로 복사 (strcpy함수
)
19-3 파일 열기와 닫기
FILE 구조체
- 표준 입출력 라이브러리는 FILE 구조체로 포인터 변수를 선언하고 파일 입출력 함수를 호출할 때마다 이 변수를 넘겨주도록 만들어져 있다.
이 구조체는 사용하려는 디스크 상의 파일이 어떤 상태로 사용 중인지에 대한 정보를 담고 있으며,
파일을 좀 더 편하게 사용할 수 있도록 도와 준다.
파일 열기: fopen 함수
매개변수로 파일 이름의 문자열과 파일 사용 형식을 받는다.
Example FILE *p_file = fopen("C:\\tipssoft\\tips.dat", "r");
파일 사용 형식 알아보기
t
- 텍스트 속성으로 파일을 사용하겠다.b
- 바이너리 속성의 파일을 사용한다.
r
- 파일 내용 읽기 모드w
- 파일에 데이터 쓰기 모드a
- 파일에 데이터 이어 쓰기 모드
파일 사용 형식에서 읽기 와 쓰기를 같이 사용하기
r+
- 읽기 강조: 기존 데이터의 위치로 이동해서 해당 위치의 내용을 덮어쓸 수 있다.w+
- 쓰기 강조: 기존 파일이 없으면 파일을 새로 만들고, 이미 존재하면 기존 파일의 내용을 모두 지우고 시작a+
- 읽기와 이어 쓰기를 같이 사용하기: 기존 파일이 없으면 파일을 새로 만들고, 지우지 않고 기존 내용에 이어서 시작
파일 닫기: fclose 함수
사용이 끝나면 꼭 닫아라.
열지도 않고 닫거나 이미 닫았는데 또 닫지 마라.
19-4 텍스트 파일에 데이터 읽고 쓰기
- 텍스트 파일에 문자열 저장하기:
fprintf
함수 - 바이너리 형태를 문자열 형태로 저장하기:
fprintf
함수 - 텍스트 파일에서 문자열 읽기:
fscanf
함수 - 텍스트 파일에서 한 줄 단위로 문자열 읽기:
fgets
함수
19-5 바이너리 파일에 데이터 읽고 쓰기
바이너리 속성은 반드시 크기를 적어 주어야 한다.
바이너리 파일에 데이터 저장하기: fwrite
함수
파일 포인터가 가리키는 바이너리 파일에 내가 쓰고 싶은 변수의 값에 지정한 크기로 복사된다.
저장할 데이터의 시작 주소부터 데이터의 기준 단위 크기로 반복 횟수만큼 파일에 데이터를 쓰게 된다.
배열을 저장할 때 배열의 크기만큼을 반복횟수로 정해 주면 된다.
또는, 지정 크기 * 배열의 크기, 반복 횟수는 1로 지정할 수도 있다.
또는, sizeof(data) 처럼 배열 크기를 지정 크기로 지정할 수도 있다.
바이너리 파일에서 데이터 읽기: fread
함수
파일 포인터가 가리키는 바이너리 파일에서 프로그래머가 지정한 크기로 데이터를 읽어서 변수에 저장
읽기 모드로 파일을 열면 파일의 처음 위치부터 데이터를 읽을 수 있다.
그 다음 fread 함수를 호출하면 파일 내부 데이터를 읽거나 쓰기 시작하는 위치가 지정한 크기만큼 증가하여 읽어 들이기 시작한다.
파일 내부의 작업 위치를 탐색하고 확인하기: fseek
, ftell
함수
fseek
함수 - 파일의 데이터를 읽을 기준 위치로 SEEK_SET
(파일의 시작), SEEK_END
(파일의 끝), SEEK_CUR
(현재 위치)를 사용
지정한 기준 위치로부터 사용자가 지정한 '이동 거리'만큼 이동,
양수를 명시하면 지정한 기준 위치에서 뒤로, 음수를 명시하면 앞으로 이동
이렇게 이동한 위치를 값으로 확인하고 싶다면 ftell
함수를 사용
'Programming Language > Do it! C언어' 카테고리의 다른 글
[Do it! C언어 입문] 부록 (0) | 2022.11.11 |
---|---|
[Do it! C언어 입문] 20장. 함수 포인터 (0) | 2022.11.11 |
[Do it! C언어 입문] 18장. 구조체와 연결 리스트 (0) | 2022.11.11 |
[Do it! C언어 입문] 17장. 다차원 포인터 (0) | 2022.11.11 |
[Do it! C언어 입문] 16장. 메모리 할당 (0) | 2022.11.11 |