728x90
반응형
8.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) 위 프로그램의 실행결과를 파일에 출력하도록 재지정
- 위 코드를 빌드해서 실행 파일을 만듦 (파일 제목 : Project1.exe)
- cmd 창을 킨 후 cd C:\Users\LimYoungSeong.DESKTOP-C4B52I0\source\repos\Project1\Debug\ 입력
- 현재 프로그램의 debug 폴더의 위치로 이동
-
dir을 입력하여 현재 directory의 구성 확인
- Project1.exe를 cmd창에 입력하여 실행
cmd창에 결과가 나옴
- Project1.exe > output.txt 입력
- output.txt 파일을 만들고 콘솔창이던 Project1.exe의 출력 방향을 output.txt으로 재지정 (Redirection)
- output.txt 입력하여 파일 열기
output.txt가 열리고 안에 프로그램의 결과값이 출력되어 있음
- 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) 위 프로그램이 입력받을 내용을 파일에 미리 넣어놓기
cmd 창에서 프로그램 실행 후 orange를 입력하면 I love orange 출력 - txt 파일(input.txt)을 하나 생성하고 melon 입력
- Project1.exe < input.txt 입력
- input.txt를 Project1.exe의 입력으로 redirection
프로그램 실행 결과 출력
- Project1.exe<input.txt>output.txt 입력
- 파일에 있는 데이터(melon)가 프로그램에 입력되고 그 결과값(I love melon)이 debug 폴더에 txt 파일(output.txt)로 생성
- Project1.exe>>output.txt 입력 후 banana 입력
- Project1.exe의 실행 결과인 I love Melon 뒤에 방금 입력의 실행 결과인 I love banana가 덧붙여진 형태로 파일이 만들어짐
#include <stdio.h>
int main()
{
printf("programming");
return 0;
}
- copy Project1.exe text.exe
- Project1.exe를 text.exe에 복사
-
#include <stdio.h> int main() { char str[100]; scanf("%s", str); printf("I love %s\n", str); return 0; }
- 위 코드를 빌드하여 Project1.exe에 덮어씀
- 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
반응형
'Study_C, C++ > 홍정모의 따라하며 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 8.6 입력 확인하기 (0) | 2022.03.06 |
---|---|
[홍정모의 따라하며 배우는 C언어] 8.4 사용자 인터페이스는 친절하게 ~ 8.5 숫자와 문자를 섞어서 입력받기 (0) | 2022.03.03 |
[홍정모의 따라하며 배우는 C언어] 7.11 최대, 최소, 평균 구하기 예제 ~ 7.13 goto를 피하는 방법 (0) | 2022.02.05 |
[홍정모의 따라하며 배우는 C언어] 7.8 단어 세기 예제 ~ 7.10 루프 도우미 continue와 break (0) | 2022.01.28 |
[홍정모의 따라하며 배우는 C언어] 7.7 논리 연산자 Logical operators (0) | 2022.01.24 |