장점 1. typedef 는 배열, 포인터와 같은 형식도 재정의 가능
2. 자료형의 크기를 쉽게 바꿀 수 있다
배열의 한계
데이터의 그룹화2 : 구조체
구조체로 만든 자료형으로 변수 선언하기
struct와 typedef를 조합해서 구조체 변수를 선언하는 방법
구조체로 선언한 변수의 요소 사용하기
구조체 문법으로 선언한 변수의 초기화 방법
int data[3] = {1, 2, 3} 배열의 각 요소에 순서대로 1,2,3,이 대입
바이너리 파일 : 1. 바이너리 속성이 적용된 파일
2. 이미지파일, 음악 파일, 동영상 파일, 실행 파일 등등
텍스트 파일 : 1. 문자열 속성이 적용된 파일, 소스 파일
FILE 구조체 : 사용하려는 디스크(Disk)상의 파일이 어떤 상태로 사용 중인지에 대한 정보를 담고있으며, 파일을 좀더 편 하게 사용하도록 도와줌 표준 입출력 라이브러리에서 파일 입출력 함수를 호출할 때마다 FILE 구조체의 포 인터 변수를 넘겨주도록 함
파일 열기 함수(fopen) : 함수 원형 : FILE *fopen(const char *filename, const char *mode);
함수 사용 형식 : fopen(사용할 파일 이름, 파일 사용 형식)
반환값 : 1. 파일을 성공적을 열면 FILE*형식의 메모리 주소 값을 반환
2. 파일이 존재하지 않거나 파일 형식을 잘못 사용하여 파일 열기에 실패하면 NULL 값을 반환
파일 사용 형식 : 파일을 어떻게 사용할 것인지 지정하는 형식
t형식 : 1. 텍스트 속성으로 파일을 사용하겠다는 뜻
2. t 형식으로 바이너리 파일을 열면 파일 열기는 성공 하지만 파일 입출력 함수를 사용하면 오류가 발생
b형식 : 1. 바이너리 속성의 파일을 사용한다는 뜻
2. 형식을 따로 지정하지 않는다면 b형식이 기본 값
파일 내용 읽기 모드 "r" : 1. 파일의 내용을 읽기(Read) 위한 목적으로 파일을 연다 2. 파일이 없는 경우 파일 열기에 실패 하고 NULL을 반환
파일에 데이터 쓰기 모드 "w" : 1. 파일에 데이터를 쓰기(Write) 위한 목적으로 파일을 연다
2. 파일이 없는 경우 그 이름으로 파일을 만든 후에 파일을 연다
3. 같은 이름의 파일이 이미 있는 경우 파일을 열면서 파일 내용을 삭제 4. 디스크(Disk)에 용량이 부족하거나 CD와 같이 읽기 전용 디스크에 쓰기 모드로 사용하면 파일 열기에실패
파일 데이터 이어 쓰기 모드 "a" : 1. 파일에 데이터를 확장(Append, 이어쓰기) 위한 목저으로 파일을 연다
2. 파일이 없는 경우 그 이름으로 파일을 만든 후에 파일을 연다
3. 같은 이름의 파일이 있더라도 기존 파일 내용에 이어 쓰기 4. 디스크에 용량이 부족하 거나 읽기 전용 디스크에 사용하면 파일 읽기에 실패
파일 사용 형식에서 읽기와 쓰기를 같이 사용하기
읽기 강조 "r+" : 1. 읽기와 쓰기를 같이 사용할 때 "읽기"를 더 강조하는 형식
2. 기존 파일이 없으면 파일을 새로 만들지 않고 파일 읽기에 실패
3. 기존파일이 있으면 파일의 처음 위치로 이동해서 해당 위치의 내용을 덮어쓸 수 있다 4. "r+", "rb+", "r+b" 또는 "rt+", "r+t"와 같이 사용
쓰기 강조 "w+" : 1. 읽기와 쓰기를 같이 사용할 때 "쓰기"를 더 강조하는 형식
2. 기존 파일이 없으면 파일을 새로 생성
3. 기존 파일이 있으면 기존 파일의 내용을 모두 지우고 시작
4. "w+", "wb+", "w+b" 또는 "wt+", "w+t"와 같이 사용
읽기와 이어 쓰기를 같이 사용하기 "a+" : 1. 읽기와 이어 쓰기를 같이 사용하는 경우 '확장'을 더 강조하는 형식
2. 기존 파일이 없으면 파일을 새로 생성 3. 기존 파일이 있으면 파일의 내용을 지우지 않고 이어 쓰기
3. "r+"처럼 기존 데이터 위치로 이동해서 읽기가 가능 4. 하지만 쓰기를 사용하면 파일의 끝에 내용이 추가 5. "a+", "ab+", "a+b" 또는 "at+", "a+t"와 같이 사용
파일 닫기 함수(fclose) : 함수 원형 : int fclose(FILE *stream) 함수 사용 형식 fclose(파일 포인터)
1. fopen 함수를 사용하여 파일을 사용하다 사용이 끝나면 fclose 함수를 사용하여 파일을 닫는다
2. 파일을 열어 놓고 파일을 닫지 않으면 파일 내용이 지워지거나 파일을 사용할 수 없는 상태가됨
텍스트 파일에 문자열 저장하기(fprintf) : fprintf 함수는 파일 포인터를 받아서 출력할 문자열을 파일에 저장
함수 원형 : int fprintf(FILE *stream, const char *format [argument]....)
함수 사용 형식 : fprintf(파일 포인터, 파일에 입력할 문자 형식, 출력할 값들,...)
fprintf 함수는 변수 값을 문자열로 파일에 출력 가능
표준 입출력 함수에서 제공하는 형식 지정 키워드 사용 가능
텍스트 파일에서 문자열 읽기(fscanf) : fscanf 함수는 텍스트 파일에서 문자열을 얻디 위해 사용
함수 원형 : int fscanf(FILE *stream, cosnt char*format [argument]...)
함수 사용 형식 : fscanf(파일 포인터, 파일에서 데이터를 입력 받을 형식, 일력 받을 변수 목록)
텍스트 파일에서 한 줄 단위로 읽기(fgets) : 텍스트 파일에서 한 줄 단위로 문자열을 처리하고 싶은 경우 사용
함수 원형 : char *fget(char *string, int n, FILE *stream)
함수 사용 형식 : fgets(파일에서 읽은 문자열을 저장할 메모리의 주소, 첫 번째 매개변수로 사용한 메모리의 크기, 파일 포인터)
바이너리 파일에 데이터 저장하기(fwrite) : 함수 원형 : size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream)
함수 사용 형식 : fwrite(저장할 데이터의 시작 주소, 저장할 데이터의 기준 단위 크기, 반복 횟수, 파일 포인터)int data = 0x000000412 / data 변수가 할당된 메모리를 4바이트 크기만큼 1회만 p_file 포인터 가 가리키는 파일에 저장함
fwrite(&data, sizeof(int), 1, p_file)
1. 저장할 데이터의 시작 주소부터 데이터의 기준 단위크기로 반복 횟수만큼 데이터를 파일에 쓴다 2. 파일에 저장되는 크기 : 기준 단위 크기 x 반복 횟수
바이너리 파일에서 데이터 읽기(fread) : 함수 원형 : size_t fread(void *buffer, size_t, size, size_t count, FILE *stream)
함수 사용 형식 : fread(읽은 데이터를 저장할 주소, 저장할 데이터의 기준 단위 크기, 반복 횟수, 파일 포인터)
int data / p_file이 가리키는 파일에서 4바이트 크기만큼 1회만 데이터를 읽어 와서 data 변수에 저장함
fread(&data, sizeof(int), 1, p_file)
1. 파일에서 기준 단위 크기로 반복 횟수만큼 데이터를 읽어와서 '데이터를 저장할 주소'에 읽은 데이터를 저장 2. 파일에서읽은 크기 : 단위 크기 x 반복 횟수
파일 내부의 작업 위치 탐색하고 확인하기(fseek, ftell) : 함수 원형 : int fseek(FILE *stream, long offset, int origin)
함수 사용 형식 : fseek(파일 포인터, 이동 거리, 기준 위치)
1. 지정한 기준 위치로부터 사용자가 지정한 '이동 거리'만큼 이동
2. 기준 위치로 SEEK_SET(파일의 시작), SEEK_END(파일의 끝), SEEK_CUR(현재 위치)
3. 이동 거리는 양수 또는 음수 모두 가능 4. 실제 이동 위치는 파 일 포인터에 저장
fseek(p_file, 0, SEEK_SET) / 파일의 시작 위치로 이동 / fseek(p_file, 32, SEEK_CUR) / 현재 위치에서 32바이트만큼 뒤 로 이동 /
파일 내부의 작업 위치 탐색하고 확인하기(fseek, ftell) : 함수 원형 : long ftell(FILE *stream)
함수 사용 형식 : 파일 내에서 데이터를 읽거나 저장할 위치 = ftell(파일 포인터)
1. 이동한 위치를 값으로 확인할 때 ftell 함수 사용 2. ftell 함수의 반환값은 시작 위치를 0으로 계산한 값