연재 완료/C Lang 이론

C언어 이론 12. 파일처리 (기본, 스트림, 고수준의 파일 입출력 함수들)

라이피 (Lypi) 2018. 6. 14. 19:59
반응형

내용 출처 : YES C (정보공학연구소 /생능출판사)

               혼자 연구하는 C/C++ (SoEn.kr /와우북스)



Ⅰ. 파일처리 기본
   ① '파일'이란 '프로그램을 처리하는데 사용되는 입출력 장치에 적용되는 논리적 개념'이다.
   ② '파일'은 '디스크에 정보가 저장되는 단위'이며 고유의 이름을 가진다.

   ③ C언어는 파일 입출력 방식으로 고수준과 저수준 두가지를 지원한다. 둘의 차이점은 다음과 같다.

   

 

고수준

저수준 

버퍼 사용

사용

메모리로 직접 읽어들임

입출력 대상

스트림

파일 핸들

속도

느리다.

빠르다.

문자 단위 입출력

가능

가능하지만 비효율적이다.

세밀한 조작

어렵다.

가능하다.

난이도

비교적 쉽다.

조금 어렵다.

   

   ④ 두 방식의 가장 큰 차이점은 버퍼의 사용 유무이며 나머지는 이에 따라 파생되는 특성들이다.

   ⑤ '버퍼'란 '스트림으로부터 입출력되는 데이터를 잠시 저장하는 메모리 영역'이다.



Ⅱ. 입출력과 스트림(Stream) (참고함 : C언어 스트림의 이해)

   ① 프로그램에서의 데이터 입력과 출력은 데이터의 흐름을 의미한다. 프로그램의 밖으로 나가면 출력이고, 밖에서 프로그램으로 들어오면 입력이다.

   ② 입력의 대표적인 예는 키보드이고, 출력의 대표적인 예는 모니터이다. 여기서 그 대상이 파일이 될 수도 있다.

   ③ 스트림은 이런 대상과 대상을 이어주는 단방향 통로이다. 

   ④ stdin, stdout등은 C언어에서 기본적으로 제공하는 표준 스트림으로 자동으로 프로그램을 킬 때 열리고, 끌 때 닫힌다.


파일포인터

기능

내용

stdin(standard input file)

표준입력

키보드로 입력받음

stdout(standard output file)

표준출력

화면으로 출력

stderr(standard error file)

표준오류출력

화면으로 오류메시지 출력


   ⑤ 대부분의 운영체제는 서로 다른 장치들을 같은 스트림으로 이어주고 있으므로 동일한 방식으로 입출력을 관리할 수 있다.

   ⑥ 스트림은 내부에 입출력 버퍼를 가지고 있으며 이 버퍼는 스트림에 의해 자동으로 관리된다.

   ⑦ 스트림의 현재 상태는 FILE구조체에 기억되며, 이는 stdio.h에 다음과 같이 정의되어 있다. (VS2017기준)

    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;



Ⅲ. 고수준 파일 입출력 함수들


함수명

형식

기능

 fopen()

FILE* fopen 

(const char* filename, const char* mode)

파일과 연결된 새로운 스트림을 개방하고, FILE형 구조체를 만들어 

개방한 스트림에 관한 정보를 기입한 후, 그 포인터를 리턴한다.

 fclose()

 int fclose(FILE* stream)

개방한 스트림을 닫는다.

fgetc()

int getc(FILE* stream)

 스트림으로부터 한 문자를 읽어온다.

fputc()

int putc(int c, FILE* stream)

스트림으로 문자c를 출력한다.

fgets()

char* fgets(char* s, int n, FILE* stream)

스트림에서 문자열을 읽어와 s에 기록한다.

fputs()

int fputs(const char* s, FILE* stream)

문자열을 스트림으로 출력한다.

ungetc()

int ungetc(int c, FILE* stream)

문자 c를 입력 스트림으로 다시 push한다. 

fscanf()

int fscanf

(FILE* stream, const char* fromat, ...)

스트림으로부터 서식화된 입력을 행한다. (scanf와 동일)

fprintf()

int fprintf

(FILE* stream, const char* format, ...)

스트림으로 서식화된 출력을 행한다. (printf와 동일)

fread()

size_t fread

(void* ptr, size_t size, size_t n, FILE* stream)

스트림으로부터 길이가 size인 데이터 항목 n개를 

ptr이 가리키는 메모리로 읽어들인다.

fwirte()

size_t fwrite

(const void* ptr, size_t size, size_t n, FILE* stream)

스트림으로 ptr이 가리키는 곳에 있는 데이터를 

size*n바이트만큼 출력한다.

fseek()

int fseek(FILE* stream, long int offset, int whence)

스트림의 파일 포인터를 새롭게 설정한다.  

ftell()

int ftell(FILE* stream)

스트림의 현재 파일 포인터의 위치를 조사한다.


   

반응형