본문 바로가기

Study_C, C++/홍정모의 따라하며 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 8.1 입출력 버퍼 ~ 8.3 입출력 방향 재지정

728x90
반응형

8.1 입출력 버퍼 

- 버퍼란?

이미지 출처 : http://www.tcpschool.com/c/c_io_console

  • 버퍼란 위의 사진처럼 입력받은 값들을 임시로 모아놓는 공간

- 버퍼를 사용하는 이유

  • 프로그래밍시 가장 느린 작업은 입출력 작업이고 그 다음은 메모리 할당 과정
  • 느린 입출력 작업 속도의 개선을 위해 버퍼 방식을 사용
    • 입력을 받을때마다 하나씩 바로바로 출력하면 속도가 느리다
    • 위의 방식을 대신해서 입력을 버퍼에 모았다가 2가지 경우가 되면 출력
      1. 버퍼가 다 찼을 때
      2. 엔터를 쳤을 때 ('\n' 이 들어올 때). 콘솔 입출력, 즉 지금까지 우리가 봐온 경우는 전부 이 방식
    • 버퍼의 크기는 시스템 마다 다르나 보통 효율성을 가장 높일 수 있는 구조로 설계됨
    • 크기 조절 가능
    • 비싼 GPU는 메모리가 커서 버퍼의 크기가 더 넓음

 

1) 표준 입출력 함수 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main() 
{
    char c;

    while ((c = getchar()) != '.')
        putchar(c);
   
    return 0;
}
  • 표준 입출력 함수 getchar( )를 이용하여 입력받은 문자를 출력하는 프로그램
Output : 
(hello. 입력)
hello
  • 하나씩 입력받은 문자들을 버퍼에 저장한 후 ' . '가 입력되면 한번에 출력
  • 입력은 한글자씩 받고 출력 하나 입력받는 글자 전체에 대해서 작동함

 

2) 비표준 입출력 함수

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>	 
#include <conio.h>  	// 콘솔 비표준 함수 사용을 위한 library. windows에서만 작동

int main() 
{
    char c;

    while ((c = _getche()) != '.')
        putchar(c);
   
    return 0;
}

 

  • 버퍼를 사용하지 않는 비표준 함수 _getche( )는 위처럼 문자가 입력되면 바로 출력함
    • e는 echo의 이니셜로, 입력값이 메아리치듯 출력된다는 뜻 
  • // windows에서만 작동, 콘솔 비표준 함수, 즉 버퍼를 사용하지 않는 입력 함수들 _getch(), _getche()
    // 표준 입출력 함수들은 버퍼를 사용

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <conio.h>  

int main() 
{
    char c;

    while ((c = _getch()) != '.')
        putchar(c);
   
    return 0;
}

 

Output : 
(abcde 입력)
None
  • _getch( ) 도 비표준 입출력 함수이나 _getche( )와는 달리 입력값을 화면에 보여주지 않음 

 

 

* 콘솔이란 : 입력장치와 출력장치를 모아서 부르는 말

  • 터미널 : 로컬 또는 원격에서 접속할 수 있는 콘솔을 구현한 소프트웨어
  • 쉘 : 명령어를 실제로 전달하고 결과값을 전달받는 프로그램

 

 

8.2 파일의 끝 (EOF)

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF)   // End of file
        putchar(c);

    return 0;
}
#define EOF    (-1)		// stdio.h에 EOF == -1로 정의되어있음

 

Output : 
hello 입력
hello
^Z 입력
종료

 

  • ^Z = Ctrl + z
  • C언어에서는 내부적으로 ASCII Code로 문자를 표현하는데, 이 때 ASCII Code에는 음수가 없다
  • 하지만 위의 코드는 signed integer를 이용해서 c를 입력받고, getchar( ) 함수에서도 반환값을 int로 넘겨준다
  • 이는 입력이 종료됐을 때 getchar( ) 함수가 -1을 return하기 때문이다
    • 입력의 종료는 OS가 알려줌
    • 콘솔과 파일의 입력을 종료시키는 방법은 동일
  • 콘솔 입력시 EOF를 만들어 입력을 종료시키려면 (getchar( )가 -1을 return하게 하려면) Ctrl + z 입력

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
    int c;

    while (1) {
        c = getchar();
        printf("%d\n", c);
        if (c == EOF)
            break;
    }

    return 0;
}

 

Output :
(hi 입력)
104
105
10
(abc 입력)
97
98
99
10
(^Z 입력)
-1

 위의 출력값으로 Ctrl + z == -1임을 알 수 있다

 

* Stream : 데이터의 일련의 연속성을 가진 흐름을 의미.

  • 콘솔창에 입력한 데이터들이 흘러 프로그램으로 들어감
  • 파일도 마찬가지로 파일에 저장되어있는 데이터들이 흘러 프로그램으로 들어감

EOF는 이러한 stream의 종료를 표시

 

 

8.3 입출력 방향 재지정 (Redirection)

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
    printf("I love apple.\n");  

    return 0;
}

1) 위 프로그램의 실행결과를 파일에 출력하도록 재지정

 

  1. 위 코드를 빌드해서 실행 파일을 만듦 (파일 제목 : Project1.exe)
  2. cmd 창을 킨 후 cd C:\Users\LimYoungSeong.DESKTOP-C4B52I0\source\repos\Project1\Debug\ 입력
    • 현재 프로그램의 debug 폴더의 위치로 이동
    •  
      dir을 입력하여 현재 directory의 구성 확인
  3. Project1.exe를 cmd창에 입력하여 실행
    • cmd창에 결과가 나옴
  4. Project1.exe > output.txt 입력
    • output.txt 파일을 만들고 콘솔창이던 Project1.exe의 출력 방향을 output.txt으로 재지정 (Redirection)
    • output.txt 입력하여 파일 열기
    • output.txt가 열리고 안에 프로그램의 결과값이 출력되어 있음
    •  
  5. explorer . 입력
    • ' . ' 은 현재 directory를 의미
    • 현재 위치에서 탐색기가 열림
    • Debug 폴더 안에 output.txt 파일이 있음
    • notepad output.txt를 입력해서도 파일을 열 수 있음

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
    char str[100];
    scanf("%s", str);
    printf("I love %s\n", str);

    return 0;
}

2) 위 프로그램이 입력받을 내용을 파일에 미리 넣어놓기

  1. cmd 창에서 프로그램 실행 후 orange를 입력하면 I love orange 출력
  2. txt 파일(input.txt)을 하나 생성하고 melon 입력
  3. Project1.exe < input.txt 입력
    • input.txt를 Project1.exe의 입력으로 redirection
    • 프로그램 실행 결과 출력
  4. Project1.exe<input.txt>output.txt 입력
    • 파일에 있는 데이터(melon)가 프로그램에 입력되고 그 결과값(I love melon)이 debug 폴더에 txt 파일(output.txt)로 생성
  5. Project1.exe>>output.txt 입력 후 banana 입력
    • Project1.exe의 실행 결과인 I love Melon 뒤에 방금 입력의 실행 결과인 I love banana가 덧붙여진 형태로 파일이 만들어짐

 

#include <stdio.h>

int main()
{
    printf("programming");
      
    return 0;
}
  1. copy Project1.exe text.exe
    • Project1.exe를 text.exe에 복사
  2. #include <stdio.h>
    
    int main()
    {       
        char str[100];
        scanf("%s", str);
        printf("I love %s\n", str);
    
        return 0;
    }

    • 위 코드를 빌드하여 Project1.exe에 덮어씀
  3. text.exe | Project1.exe
    • ' | '   는 pipe 기능
    • text.exe의 실행결과가 Project1.exe 로 파이프를 타고 흘러들어감

 

 

  • 데이터가 stream으로 흘러다닌다는 것을 이해
  • 데이터의 흐름을 콘솔 출력으로 보내던 것을 파일로 보낼 수 있다 (redirecting)
  • End Of File은 데이터의 흐름이 있을 때마다 사용됨

 

* 각 파일들의 확장자명 보는 법

설정 -> 보기 -> '알려진 파일 형식의 파일 확장명 숨기기'를 체크 해제하여 모든 파일의 확장자 명을 볼 수 있음

 

 

 

 

 


https://www.inflearn.com/course/following-c/dashboard

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., - 강의 소개 | 인프런...

www.inflearn.com

 

728x90
반응형