728x90

- 파일 열기 


파일을 액세스하려면 먼저 대상 파일을 열어야(Open) 한다. 파일을 오픈한다는 것은 파일 입출력을 하기 위한 준비를 한다는 뜻이다. 

* 여기서 엑세스(Access)는 말 그대로 파일에 접근하는 것을 뜻한다.



스트림 입출력을 위해서는 파일의 데이터를 잠시 저장하는 내부 버퍼가 필요하며 파일의 현재 위치(FP)를 초기화해야 하는데 이런 준비를 하는 과정이 오픈이다. 

* Stream - 길이를 측정할 수 없는 특정한 data가 왔다갔다하는 것을 말하며, 이를 스트림 입출력이라고 한다. 

스트리밍 서비스의 음악, 동영상 감상 등이 이를 이용한 것이다. 받는 data의 양은 상황과 환경에 따라 유동적이다.


* 내부 버퍼 - 파일의 데이터를 잠시 임시로 저장하는 메모리 공간을 말한다.

모든 변수도 버퍼에 저장된다 볼 수 있다.


* 현재위치(File Pointer)  

                                   파일 (FILE)


탐색한다(SEEK) 

                         △ 여기서 파일을 탐색한 특정 지점을 FP라고 할 수 있다.




파일을 오픈할 때는 다음 함수를 사용한다. 

FILE *fopen(const char *filename, const char *mode);


먼저 인자의 갯수가 일치하는지 확인하고 인자의 Type이 서로 맞는지 확인한 다음, 최종적으로 반환값 일치여부를 확인한다.


  1.  #include <stdio.h>  
  2.   
  3. void smart(int Z); // int Z에서 type name Z는 컴파일에서 크게 중요하지 않음, 하지만 구분을 위해 의미있는 이름을 쓰기도 한다.  
  4.   
  5. int main()  
  6. {  
  7.     //FILE *fp;  
  8.     FILE *fp=fopen("A.txt""w");   
  9.     fprintf(fp, "파일입출력");  
  10.     //smart(printf);    
  11.     printf("파일입출력");  
  12.     fclose(fp);  // 파일을 닫음
  13.     return 0;  
  14. }  
  15. void smart(int A)  
  16. {  
  17. }  
다음의 예제 소스를 보자. 

파일경로에서 \\를 2개 쓰는 이유는 만약 \ 하나를 쓴다면 컴파일러에서 이를 개행(new line \n)으로 인식하고 컴파일하기 때문이다.

  1.  #include <stdio.h>  
  2.   
  3.   
  4. int main()  
  5. {  
  6.     FILE *f;  
  7.     f=fopen("c:\\영화\\코미디\\영구와땡칠이.avi","rb");  
  8.     if (f==NULL) {  
  9.                 printf("얼씨구. 파일이 안 보이네요\n");  
  10.              }  
  11.   
  12.     int fclose(FILE *stream);  // 사용한 stream 파일을 닫고, 버퍼를 비우게 된다.
  13.     return 0;  
  14. }  
컴파일 후 실행했을 때의 결과.

"c:\영화\코미디\" 디렉토리에 영구와땡칠이.avi 라는 파일을 읽을 수 없다면
(NULL) 을 리턴하고 ("얼씨구. 파일이 안 보이네요\n") 를 출력하게 된다.




여기서 도스 명령창을 통해 명령어와 절대 경로<->상대 경로를 배운다.

절대 경로가 변하지 않는 경로라면, 상대경로는 특정 위치를 기준으로 변화하는 경로이다. 



"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라고 한다.



다음은 헥사값을 보기 위한 예제이다.


  1.  #include <stdio.h>  
  2.   
  3. void Hexaview(unsigned char *ucpData, unsigned int uiLen)  
  4. //void Hexaview(char *cpData, unsigned int uiLnt)  
  5. {  
  6.     unsigned int uiCnt;  
  7.     unsigned int ui16Cnt;     
  8.   
  9.     printf("====================Hexa Viewer============================\n");         
  10.     uiCnt=0;  
  11.     while(160>uiCnt)  
  12.     {  
  13.     printf("%p ", uiCnt);  
  14.   
  15.         ui16Cnt=0;  
  16.         while(16>ui16Cnt)  
  17.         {  
  18.             printf("%02x ", *ucpData);  // %02 -> 2자리로 출력하되 값이 없는 자리는 0으로 출력하라, %x는 16진수 출력을 의미
  19.             ui16Cnt=ui16Cnt+1;  
  20.             ucpData=ucpData+1;  
  21.         }         
  22.            
  23.         uiCnt=uiCnt+16;  
  24.         printf("\n");  
  25.     }  
  26.      printf("===========================================================\n");   
  27. }  
  28. int main()  
  29. {  
  30.     unsigned char ucBuff[ ]="1234567890ABCDEF";  // 헥사 값 16바이트. 즉, 한줄씩 저장되는 버퍼. 
  31.     //Hexaview(NULL, 0);  
  32.     Hexaview(ucBuff, 0);  
  33.     return 0;  
  34. }  

    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

+ Recent posts