파일 입출력
파일 입출력에는 두 가지 방식이 있다.
- High level : 버퍼를 사용한다. 응용 프로그램에서 사용된다. ex) FILE* fp = fopen(...), open - rw - close
- Low level : 좀 더 가벼운 버퍼를 사용한다. 드라이버 등 로우 레벨의 프로그램 제작에 사용된다. ex) int fopen = open(...);
임베디드 분야 : ARM 등 SoC, Language(C, C++ ...), OS(RTOS, Linux), 통신(CAN, UART, etc) 정도가 기본(공통적인 지식)
파일 입출력은 스프림 파일을 통해서 수행한다. 파일을 개방하면 스트림 파일을 만들고, 파일 포인터를 반환한다.
스트림은 결국 파일이다. 파일을 통해서 어플리케이션과 운영체제가 소통하는 모습을 보인다.
cache 메모리와 유사한 원리로 응용된다. 어느정도 버퍼(파일)가 채워져야 기기 간 통신이 이루어진다. 단 강제로 flush 함수를 이용하여 통신을 하게 할 수 있다.
바이너리 파일과 텍스트 파일의 차이점은 바이너리 파일의 경우 사용자 또는 프로그램이 사용하던 정보나 숫자 값을 특별한 가공 없이 저장하는 반면, 텍스트 파일은 가공이 들어간다는 것이다. 예를 들어 바이너리 파일의 경우 '\n'을 줄 바꾸기 명령어로 해석하는 것이 아니라 해당 문자에 해당하는 값으로 보고 입출력을 수행한다. 반면 텍스트 파일의 경우 인코딩 체계에 맞추어 읽을 수 있는 문자열로 바꾼 후 입출력을 수행한다.
모드 : r(읽기), w(쓰기, 완전 초기화), a+(뒤에 추가하기), w+(뒤에 추가하기), r+(읽고 뒤에 추가하기)
전처리 및 분할 컴파일
전처리 지시자
- #include : 지정한 파일의 내용을 읽어와서 지시자가 있는 위치에 부착
- #define : 메크로명을 정의하는 지시자 - 상수형(단순 대입), 함수형 (단순 대입 - 함수와 다르게 call을 하지 않고 그대로 넣어준다. 괄호 적극적으로 사용)
- 이미 정의된 매크로 : __FILE__(전체 디렉터리 경로를 포함한 파일명), __FUNCTION__(매크로명이 사용된 함수의 이름), __LINE__(매크로명이 사용된 행 번호), __DATE__(컴파일을 시작한 날짜), __TIME__(컴파일을 시작한 시간)
- #ifdef, #ifndef, #if etc : 조건에 따라서 전처리 과정을 수행할 지 말지 선택 가능
- #pragma : 컴파일 방법을 세부적으로 정할 때 사용
- ## : 그냥 붙여준다는 의미
오브젝트 파일을 우선적으로 만든 후(-c 옵션) 링크 작업(-o 옵션)을 해주어야 한다.
- preprocess(-E)
- compile(-S)(compile by "cc1", .c(.i) --> .s로 만드는 과정이다.(바로 오브젝트 파일을 만드는 게 아니다.))
- assemble(-c)(assembled by "as", .s -> .o, 이후로 사람이 읽을 수 있는 형태가 아님, COFF/ELF - .TEXT, .DATA, .BSS ...)
- collect(collected by "collect" or "ld", locate - address assignment(주소 할당), link, .o -> .exe(.out))
- extract
변수 타입과 분할 컴파일의 결합
***전역 변수의 범위는 프로그램 전체이다.*** - 같은 이름의 전역 변수는 충돌을 일으킨다.
extern : 다른 파일에 선언된 전역 변수를 부르고 싶을 때
static : 전역 변수의 범위를 파일 내로 한정 지을 때
헤더 파일의 중복 문제
동일한 헤더 파일을 사용하는 경우 예외 처리를 제대로 안해주면 중복 정의 문제가 발생한다. 해당 문제를 해결하기 위하여 #ifndef - #endif 문을 사용하여 중복 문제를 해결할 수 있다. - 헤더 가드
/*헤더 가드 - old style*/
#ifndef __NEW_HEADER__
#define __NEW_HEADER__
~~~~~~~~
#endif
/*최근 버전*/
#pragma once //C++에서 넘어옴
C 프로그래밍 수업이 끝났다. 다음 수업부터는 C++에 대해서 배울 것이다.
'VEDA 복습' 카테고리의 다른 글
VEDA 9일차 - C++ 프로그래밍 (0) | 2025.03.27 |
---|---|
VEDA 8일차 - C/C++ 보충 (0) | 2025.03.26 |
VEDA 5일차 - C 프로그래밍 (0) | 2025.03.21 |
VEDA 4일차 - C 프로그래밍 (0) | 2025.03.20 |
VEDA 3일차 - C 프로그래밍 (0) | 2025.03.19 |