본문 바로가기

Computer Science/따라하며 배우는 C

08 Input Output

728x90

08-01. 입출력 버퍼


버퍼란 입력을 받거나 출력을 할때, 한꺼번에 모아서 입출력을 하여 효율성을 높게 해준다.

전반적으로 다양한 경우에서 사용된다.

image

보면, 우리는 hello를 입력했고 한 글자씩 입출력이 되는 것을 예상할 것이다. 하지만 실제 실행결과를 보면, hello 전체를 입력, 출력함을 알 수 있을 것이다.

08-02. End Of File(EOF)


ASCII code는 양수밖에 없다. 하지만 왜 unsigned int가 아니라 int로 변수를 선언해 입력을 받을까?

이유는 EOF 때문이다! EOF는 -1로 define되어 있다!


int main()
{
    int c;

    while((c = getchar()) != EOF) //End Of File
        putchar(c);

}

또 하나 중요한 개념이 있는데, 이는 stream이다. 사전에서는 흘러간다는 의미이다. 컴퓨터에서는 어떤 걸 의미할까? 바로 데이터이다! 데이터가 흘러감을 의미한다.

뒤의 강의에서 file에 대해 배울 것이다. 파일에 저장된 데이터들이 흘러서 우리가 만든 프로그램으로 들어간다. 반대 방향으로도 가능하다.

이러한 데이터 스트림을 통해 데이터를 주고 받는데, 이 스트림이 언제 끝나는지를 표시하는 것이 EOF이다!

꽤 중요한 개념이니 반드시 숙지할 것!!

08-03. 입출력 방향 재지정: Redirection


gcc를 통해 c파일을 컴파일 한 후 이를 run 한다.


#include <stdio.h>

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

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

데이터 입력


image
  • 다음과 같이, input.txt file에는 MELON이라는 문자열을 저장해두었다.

  • 이후, 08_io exe file을 실행할 때 < input.txt를 통해서 리디렉션 해주니, 이를 입력으로 받아서 정상적으로 출력한 것을 확인할 수 있었다.

데이터 출력


image image
  • 다음과 같이도 코드를 짤 수 있으며, 이렇게 되면 output.txt file에 원하는 결과값을 넣을 수도 있다!

추가로 출력하기


image image
  • 이렇게 >> 부등호를 두 개 넣으면, 기존의 파일의 다음 행에 추가로 작성을 해준다!!

08-04. 사용자 인터페이스는 친절하게


이번 강의는 방법론적인 내용을 다룸!

항상 사용자는 상상하지도 못한 방식으로 프로그램을 사용하기 때문에, 이를 염두에 두고 프로그래밍을 하여야 한다.

int main()
{
    int count = 0;

    while(1)
    {
        printf("Current count is %d Continue? (Y/n)", count);

        int c = getchar();

        if (c== 'n')
            break;
        else if (c=='y')
            count++;
        else
            printf("Please input y or n! \n");

        while (getchar() != '\n')
            continue;
    }

    return 0;
}

08-05. 숫자와 문자 섞어서 입력받기



void display(char cr, int lines, int width);

int main()
{
    char c;
    int rows, cols;

    while (1)
    {
        scanf("%c %d %d", &c , &rows, &cols);
        while (getchar() != '\n') continue;
        display(c, rows, cols);
        if (c=='\n')
            break; //doesn't work well
    }
}

void display(char cr, int lines, int width)
{
    int row, col;

    for (row=1; row<=lines; row++)
    {
        for (col = 1; col <= width; col++)
            putchar(cr);
        putchar('\n');
    }
}

다음과 같이 하게 되면, 마지막에 코드를 종료하고 싶을 때 조차 엔터와 숫자 2개를 입력해주어야 한다. scanf가 모든 입력을 받아야 하기 때문이다. 그렇기에, getchar()을 같이 이용하는 것이 좋다.

void display(char cr, int lines, int width);

int main()
{
    char c;
    int rows, cols;

    printf("INPUT one character and two integers: \n");
    while ((c = getchar()) != '\n')
    {
        scanf("%d %d", &rows, &cols);

        while (getchar() != '\n') continue; // buffer에 남은 값들을 제게해줘야 한다!

        display(c, rows, cols);
        printf("INPUT another character and two integers: \n");
        printf("PRESS enter to quit \n");


    }
    return 0;
}

void display(char cr, int lines, int width)
{
    int row, col;

    for (row=1; row<=lines; row++)
    {
        for (col = 1; col <= width; col++)
            putchar(cr);
        putchar('\n');
    }
}

08-06. 입력 확인하기



long get_long(void);

int main()
{
    long number = get_long();

    return 0;
}

long get_long(void)
{
    printf("please input an integer and press enter \n");

        long input;
        char c;

        while (scanf("%ld", &input) != 1)
        {
            printf("Your input - ");

            while ((c=getchar()) != '\n')
                putchar(c); //input left in buffer

            printf(" - is not an integer. Please try again\n");

        }

        printf("Your input %ld is an integer. Thank you \n", input);

        return input;
}

08-07. 입력 스트림과 숫자

08-08. 메뉴 만들기 예제



#include <stdlib.h>

char get_choice(void);
char get_first_char(void);
int get_integer(void);
void count(void);


int main()
{
    int user_choice;

    while( (user_choice = get_choice()) != 'q')
    {

        switch (user_choice)
        {
        case 'a':
            printf("Avengers Assembe! \n");
            break;

        case 'b':
            putchar('\a');
            break;

        case 'c':
            count();
            break;
        default:
            printf("Error with %d. \n", user_choice);
            exit(1);
            break;

        }
    }

    return 0;
}

char get_choice(void)
{
    char user_input;
    printf("Enter the letter of your choice: \n");
    printf("a. avengers    b. beep \n");
    printf("c. count       q. quit \n");

    user_input = get_first_char();

    while(1)
    {
        if ( (user_input == 'a') || (user_input == 'b')|| (user_input == 'c') || (user_input == 'q'))
            break;
        else
            printf("Error put option again. \n");
            printf("Enter the letter of your choice: \n");
            user_input = get_first_char();
    }
    return user_input;

}

void count(void)
{
    int n, i;

    printf("Enter an integer: \n");
    n = get_integer();
    for (i=1; i<=n; ++i)
        printf("%d\n", i);
    while ( getchar() != '\n')
    {
        continue;
    }

}

char get_first_char(void)
{
    int ch;
    ch = getchar();
    while (getchar() != '\n')
        continue;

    return ch;
}

int get_integer(void)
{
    int input;
    char c;

    while (scanf("%d", &input) != 1)
    {
        while ( (c=getchar()) != '\n')
            putchar(c);
        printf(" is not an integer. \n Please try again.");

    }

    return input;
}
728x90

'Computer Science > 따라하며 배우는 C' 카테고리의 다른 글

10 Array, Pointer  (0) 2022.04.25
09 function, pointer  (0) 2022.03.31
07 If문  (0) 2022.03.31
06 For  (0) 2022.03.31
04 연산자  (0) 2022.03.11