스트림이란?                           


이제 포인터를 끝내고 더 나아가서 기본적으로 데이터가 입력받고 출력하는 과정에 대해서 정리해보고자 합니다. 


흔히 데이터가 출력이 되면 우리는 키보드에 데이터를 입력하고 모니터에 출력이 된다.

이때 모니터에 결과값이 나오고 또한 에러도 출력이 되기도 한다. 

이러한 데이터들이 어떻게 모니터에 나오고 또한 어떻게 값들이 키보드를 통해서 들어가게 될까??


이때 데이터의 이동수단이 되는 스트림(stream)이 등장하게 된다. 

우리가 코딩을 할때 가상의 다리인 스트림이 생성이 되게 됨으로써 값들이 출력이된다. 


흔히 출력 스트림, 입력 스트림이 나오게되는데 이러한 스트림은 프로그램이 실행되면 자동생성, 종료되면 자동으로 소멸된다. 


그렇다면 이런 스트림을 표준스트림(standard stream)이라고 불리는데 이러한 stream에는 3가지의 stream이 있다. 

stdin     표준 입력 스트림    키보드 대상으로 입력

stdout   표준 출력 스트림    모니터 대상으로 출력

stderr    표준 에러 스트림    모니터 대상으로 출력


                          입출력함수                           

스트림에서 설명했던 기반으로 문자 단위 입출력함수들에 대해서 정리해보겠습니다 .

  • 문자 입력 함수 : putchar, fputc
    • int putchar(int c) 
    • int fputc(int c, FILE * stream)
    • putchar와 fputc의 공통점은 문자정보를 출력하는 stdout 스트림입니다. 
    • 차이점은 코딩에서 보듯이 fputc에서는 stream이 있습니다. 
    • 이는 fputc경우는 스트림의 방향을 설정함으로서 입출력이 둘다 될수가 있습니다. 


  • 입력 함수 : getchar, fgetc
    • getchar : stdin 으로 표현되는 스트림으로 하나의 문자를 입력 받아서 반환하는 함수이다. 
    • fgetc : 문자 입력과 입력과 입력 받을 스트림을 지정할수가 있다. 
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void)
{
    int ch1, ch2;
 
    ch1 = getchar(); // 문자입력
    ch2 = fgetc(stdin); // 엔터 키 입력
 
    putchar(ch1);
    fputc(ch2, stdout); //엔터 키 입력
}
cs

이러한 예제의 출력값은 엔터키가 입력함수가 되어서 문자 하나만 출력이 됩니다.

 

 

계속에서 이전까지는 문자 입출력이였으면 문자열의 입출력함수는 다음과 같습니다.

  • 문자열 입출력 함수 : puts, fputs
    • int puts(const char *s);               
    • int fputs(const char *s, FILE * stream);
    • 차이점은 마찬가지로 fputs경우는 stream을 설정이 가능합니다. 
    • 한가지가 더 있다면 fputs경우는 자동으로 printf("\n")이 존재하여 다음 줄로 넘어갑니다.

  • 문자열 입력 함수 : gets, fgets
    • char *gets(char *s);
    • char *fgets(char *s, int n, FILE *stream);
    • 입력함수 경우에서는 배열로 입력을 받기 때문에 자동적으로 NULL함수의 공간이 생성이됩니다.
    • 따라서 예로들어서 arr[7]로 입력을 하면 출력되는 함수는 arr[6]까지 출력이 됩니다.
    • 또한 fgets경우는 배열의 길이가 부족하여 출력이 안되면 반복문을 나머지 데이터가 출력이 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(void)
{
    char str[7];
    int i;
 
    for (i = 0; i < 3; i++)
    {
        fgets(str, sizeof(str), stdin);
        printf("Read %d : %s \n", i + 1, str);
    }
    return 0;
}
cs

 

예로들어서 12345678을 입력으로 받고 str(7)로 범위를 설정하였다면 출력은 123456까지만 받게 되어진다.

(NULL문자를 저장하기 위하여서 1개적게 받음)

 

 

                          입출력버퍼                           

 

우리가 입력과 출력을 할때 데이터 값이 바로 출력과 입력이 되는것이 아니다.

중간에 메모리에 저장해놓았다가 출력과 입력이 되는데 이 과정에서 버퍼(buffer)를 사용되어진다.

 

  • 버퍼란 : 데이터를 임시로 모아두는 메모리 공간이다. 데이터 전송의 효율성을 위해서 버퍼링을 하게되어진다. 즉 데이터를 바로바로 보내는것보다 묶어서 한꺼번에 보내는 것이 효율적이다. (손수레를 사용하여서 짐을 옮기는 것이라고 들으면 될것이다. 
  • printf, scanf, fputc, fgetc는 표준 입출력 함수이지만 이것들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과하게 된다.
  • 버퍼는 데이터의 효율성을 높이지만 전송데이터 공간이 다 채워져야 다음 부분으로 넘어가기 때문에 데이터를 지워야할 경우가 있다.
  • 출력버퍼를 비우는 fflush 함수 : fflush(stdin), fflush(stdout)

                         문자열관련함수                         

 

그 외에 문자열에 필요한 함수들이 있다.

  • 문자열의 길이를 변환하는 함수 : strlen
    • size_t strlen(const char *s);    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
 
void remoc(char str[])
{
    int len = strlen(str);
    str[len - 1= 0;
}
int main(void)
{
    char str[100];
    printf("문자열 입력:");
    fgets(str, sizeof(str), stdin);
    printf("길이 : %d, 내용 : %s \n", strlen(str), str);
 
    remoc(str);
    printf("길이 : %d, 내용 : %s \n", strlen(str), str);
    return 0;
}
cs

문자열 입력:hello

길이 : 6, 내용 : hello


길이 : 5, 내용 : hello

예제 에서 보듯이 이 함수를 사용하여서 문자열의 길이를 줄일수가 있다.


  • 문자열을 복사하는 함수들 : strcpy,strncpy
    • char *strcpy(char *dest, const char *src);
    • char *strncpy(char *dest, const char *src, size_t n);
    • strcpy 같은 경우에서는 첫번재 저장된 문자열을 두번째 문자열에 복사한다.
    • strncpy 함수는 size_t n을 통해서 복사할 문자열의 수를 정할수가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str1[20= "1234567890";
    char str2[20];
    char str3[5];
 
    strcpy(str2, str1);
    puts(str2);
 
    strncpy(str3, str1, sizeof(str3));
    puts(str3);
 
    strncpy(str3, str1, sizeof(str3) - 1);
    str3[sizeof(str3) - 1= 0;
    puts(str3);
    return 0;
    
}
cs

1234567890

12345儆儆儆儆儆?234567890

1234

예제에서는 오류값이 나오는데 이 경우는 strncpy함수인경우는 무조건적인 복사이기 때문에 NULL함수를 복사하지 못하기 때문이다.

이 경우는 예제에서 보듯이 문자열의 길이를 줄여줘야한다.



  • 문자열을 덧붙이는 함수들 : strcat, strncat
    • char * strcat(char * dest, const char * src);
    • char * strncat(char * dest, const char * src, size_t n);
    • 마찬가지로 strncat은 원하는 만큼 문자열을 선택할수 있다.  (NULL공간은 자동으로 만들어진다) 

  • 문자열을 비교하는 함수들 : stcmp, strncm
    • 아스키코드로 비교를 한다. 
    • int strcmp(const char *s1, const char *s2);
    • int strncmp(const char *s1, const char *s2, size_t n);
    • s1이 더크면 0보다 큰 값 변환
    • s2이 더크면 0보다 작은 값 변환
    • s1이 같으면 0반환
    • strncmp경우도 원하는 만큼 문자열의 범위를 정할수 있습니다.

요기까지 정리 하겠습니다.

반응형

'공부 > C언어 ' 카테고리의 다른 글

포인터와 배열의 완성  (0) 2017.01.24

+ Recent posts