08-01. 입출력 버퍼
버퍼란 입력을 받거나 출력을 할때, 한꺼번에 모아서 입출력을 하여 효율성을 높게 해준다.
전반적으로 다양한 경우에서 사용된다.
보면, 우리는 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);
}
데이터 입력
다음과 같이, input.txt file에는 MELON이라는 문자열을 저장해두었다.
이후, 08_io exe file을 실행할 때
< input.txt
를 통해서 리디렉션 해주니, 이를 입력으로 받아서 정상적으로 출력한 것을 확인할 수 있었다.
데이터 출력
- 다음과 같이도 코드를 짤 수 있으며, 이렇게 되면 output.txt file에 원하는 결과값을 넣을 수도 있다!
추가로 출력하기
- 이렇게 >> 부등호를 두 개 넣으면, 기존의 파일의 다음 행에 추가로 작성을 해준다!!
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;
}
'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 |