- 파일 열기
파일을 액세스하려면 먼저 대상 파일을 열어야(Open) 한다. 파일을 오픈한다는 것은 파일 입출력을 하기 위한 준비를 한다는 뜻이다.
* 여기서 엑세스(Access)는 말 그대로 파일에 접근하는 것을 뜻한다.
스트림 입출력을 위해서는 파일의 데이터를 잠시 저장하는 내부 버퍼가 필요하며 파일의 현재 위치(FP)를 초기화해야 하는데 이런 준비를 하는 과정이 오픈이다.
* Stream - 길이를 측정할 수 없는 특정한 data가 왔다갔다하는 것을 말하며, 이를 스트림 입출력이라고 한다.
스트리밍 서비스의 음악, 동영상 감상 등이 이를 이용한 것이다. 받는 data의 양은 상황과 환경에 따라 유동적이다.
* 내부 버퍼 - 파일의 데이터를 잠시 임시로 저장하는 메모리 공간을 말한다.
모든 변수도 버퍼에 저장된다 볼 수 있다.
* 현재위치(File Pointer)
파일 (FILE) |
탐색한다(SEEK)
△ 여기서 파일을 탐색한 특정 지점을 FP라고 할 수 있다.
파일을 오픈할 때는 다음 함수를 사용한다.
FILE *fopen(const char *filename, const char *mode);
먼저 인자의 갯수가 일치하는지 확인하고 인자의 Type이 서로 맞는지 확인한 다음, 최종적으로 반환값 일치여부를 확인한다.
- #include <stdio.h>
- void smart(int Z); // int Z에서 type name Z는 컴파일에서 크게 중요하지 않음, 하지만 구분을 위해 의미있는 이름을 쓰기도 한다.
- int main()
- {
- //FILE *fp;
- FILE *fp=fopen("A.txt", "w");
- fprintf(fp, "파일입출력");
- //smart(printf);
- printf("파일입출력");
- fclose(fp); // 파일을 닫음
- return 0;
- }
- void smart(int A)
- {
- }
- #include <stdio.h>
- int main()
- {
- FILE *f;
- f=fopen("c:\\영화\\코미디\\영구와땡칠이.avi","rb");
- if (f==NULL) {
- printf("얼씨구. 파일이 안 보이네요\n");
- }
- int fclose(FILE *stream); // 사용한 stream 파일을 닫고, 버퍼를 비우게 된다.
- return 0;
- }
여기서 도스 명령창을 통해 명령어와 절대 경로<->상대 경로를 배운다.
절대 경로가 변하지 않는 경로라면, 상대경로는 특정 위치를 기준으로 변화하는 경로이다.
"c:\영화\코미디\" 디렉토리에서 cd c:\영화\ 명령어를 통해 이동한다면
이는 절대경로를 이용한 것이다.
하지만 c:\영화\코미디\ 디렉토리에서 현재 위치를 기준으로 상위 디렉토리로 이동할 때,
cd .. 명령어를 통해 c:\영화로 이동할 수 있다.
이는 상대경로를 이용한 것이다.
dir 명령어를 쳐보면 알 수 있지만 점 하나(.)는 은 현재 폴더 점 두개(..)는 상위 폴더를 의미한다.
도스, 윈도우즈에서는 대소문자의 구분을 하지 않으며, 여러 운영체제의 시초라고 할 수 있는 유닉스에서는 대소문자를 모두 구분한다.
개행 코드를 의미하는 CR/LF
ASCII |
|
|
10 |
CR |
Carriage Return |
18 |
LF (\n) |
Line Feed |
C언어에서 개행 코드를 의미하는 CR/LF 조합은 LF로 변환되어 읽혀지며 LF를 기록하면 CR/LF가 출력된다.
CR(Carriage Return) : 커서를 맨 앞으로 이동한다.
LF(Line Feed) : 다음 줄로 이동한다.
이런 변환을 해 주는 이유는 C 문자열 출력 함수들은 개행을 위해 확장열 LF(\n)를 사용하기 때문.
파일의 끝을 의미하는 EOF = End Of File
Ctrl+Z(0x1A)는 EOF -1로 정의되며, 반환 파일의 끝을 표현하기 위한 상수 (-1)의 값을 지닌다.
명령어 Ctrl + Z는 ASCII Code로 0x1A이다.
안녕
하세요
-> 안 / 녕 / \n / 하 / 세 / 요 / 1A->EOF(-1)
NULL은 숫자 0을 의미
# define NULL 0
주소 0을 리턴
실행파일을 2진파일(BIN)로 바꾸어서 열어보기
왼쪽부터 주소/ HEXA값 / ASCII 코드를 볼 수 있다. 헥사값을 바꿀시 아스키 코드도 따라서 바뀌는 것을 확인할 수 있을 것이다.
비트맵 파일(BMP)을 BIN파일로 바꾸고 열어보았을 때, HEXA값을 통해 파일의 확장자를 알 수 있다. 이를 MAGIC NUMBER라고 한다.
다음은 헥사값을 보기 위한 예제이다.
- #include <stdio.h>
- void Hexaview(unsigned char *ucpData, unsigned int uiLen)
- //void Hexaview(char *cpData, unsigned int uiLnt)
- {
- unsigned int uiCnt;
- unsigned int ui16Cnt;
- printf("====================Hexa Viewer============================\n");
- uiCnt=0;
- while(160>uiCnt)
- {
- printf("%p ", uiCnt);
- ui16Cnt=0;
- while(16>ui16Cnt)
- {
- printf("%02x ", *ucpData); // %02 -> 2자리로 출력하되 값이 없는 자리는 0으로 출력하라, %x는 16진수 출력을 의미
- ui16Cnt=ui16Cnt+1;
- ucpData=ucpData+1;
- }
- uiCnt=uiCnt+16;
- printf("\n");
- }
- printf("===========================================================\n");
- }
- int main()
- {
- unsigned char ucBuff[ ]="1234567890ABCDEF"; // 헥사 값 16바이트. 즉, 한줄씩 저장되는 버퍼.
- //Hexaview(NULL, 0);
- Hexaview(ucBuff, 0);
- return 0;
- }
cl hexa.c
컴파일 후 실행 결과
빨간선을 기준으로 왼쪽은 주소를 가리킨다. 아래로 내려오면서 16바이트씩 증가함을 볼 수 있다.
오른쪽에 출력되는 부분은 아스키코드로 0x30은 문자 0이며, 0x31은 문자1과 같다. (아스키 코드표 http://www.asciitable.com/)
'Study > C' 카테고리의 다른 글
2016-04-06-업무일지_포인터 및 함수 (0) | 2016.04.06 |
---|---|
20160405_포인터와 배열 (0) | 2016.04.05 |
20160401_전역변수와 포인터 (0) | 2016.04.04 |
20160329_C기초, 디버깅 (0) | 2016.03.29 |
20160308_업무일지_그 밖의 기초 학습 (0) | 2016.03.08 |