상세 컨텐츠

본문 제목

C언어 강좌(공부) #18~19장

카테고리 없음

by 바래다주기 2024. 5. 7. 04:09

본문

18장 구조체와 연결 리스트

typedef 문법

장점 1. typedef 는 배열, 포인터와 같은 형식도 재정의 가능
        2. 자료형의 크기를 쉽게 바꿀 수 있다

 

배열의 한계

  1. 배열은 ㅡ기가 같은 데이터만 그룹으로 묶을 수 있다
  2. 나이,키 ,몸무게 별로 그룹을 나누는 것보다 특정 사람의 정보를 모아서 그룹을 만드는 것이 효율적이다

데이터의 그룹화2 : 구조체

  1. 사용자 정의 자료형 정의 방법 중 한 가지
  2. C언어는 크기나 형식이 다른 데이터를 그룹으로 묶어 사용할 수 있도록 '구조체' 문법을 젝ㅇ
  3. 기본 자료형이나 사용자가 정의한 자료형을 그룹으로 묶어 새로운 자료형을 만들 수 있다

구조체로 만든 자료형으로 변수 선언하기

  1. 구조체로 만든 자료형의 크기는 {} 안에 선언한 요소들의 크기의 합
  2. 구조체 변수를 선언할 때 매번 struct 키워드를 붙여야 하는 불편함이 있음

struct와 typedef를 조합해서 구조체 변수를 선언하는 방법 

 

구조체로 선언한 변수의 요소 사용하기

 

구조체 문법으로 선언한 변수의 초기화 방법
int data[3] = {1, 2, 3} 배열의 각 요소에 순서대로 1,2,3,이 대입

  1. 구조체 문법 또한 배열과 같은 형식ㅇ로 초깃값을 대입
  2. 구조체 내부에 선언한 변수(구조체 요소)의 순서와 초깃값의 순서가 동일해야 한다

19장 파일 입출력

바이너리 파일 : 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으로 계산한 값