C++ 입출력(2)

flowjiyun·2022년 6월 22일

CPP

목록 보기
2/4
post-thumbnail

해당 내용은 Pope 님의 C++ 언메니지드 프로그래밍 강좌를 공부하면서 정리하였습니다.

입력 스트림(Input Stream)

  • cin(console in)
//정수형, 실수형 

int hours;
cin >> hours;
float price;
cin >> price;
cout << "Today I studied for " << hours << " hours." << endl;
  • C의 scanf가 위험한 이유???
    • 경계검사를 하지 않음(null 값이 들어갈 공간까지 사용할 수 있음)
      → char 배열의 길이를 모르기 때문
      → 방지를 위해 아래와 같은 코드 작성 필요
char line[512];
char temp[512];
char firstname[4];

if (fgets(line, 512, stdin) != NULL) // line에 담을 수 있는 char만 읽어옴 표준 입력으로 부터
{
	if (sscanf(line, "%s", temp) == 1 && strlen(temp) < 4)
	{
		strcpy(firstname, temp);
	}
}
  • C++에서 방지 방법
char firstname[4];
cin >> setw(4) >> firstname; // 3글자 까지 읽고 마지막 널문자 

char line[512];
int data;

"       hello     512"
cin >> line >> data; // line에 hello 들어가고 data에 512 들어감 whilespace 지나가고 저장됨.

스트림 상태(stream states)

  • 스트림에서 데이터를 읽어오는 경우 최종 상태를 저장해 줌
    실패 or 성공?
// in c
if (fgets(line, 10, stdin) != NULL)
{
	//
}

// in c++

cin >> line;
if (!cin.eof()) // end of file 만났으면 true
{
	//
}

스트림 상태의 종류

  • 네임 스페이스 : ios_base
  • 비트 플래그
    • goodbit
    • eofbit
    • failbit
    • badbit
  • 메소드 버전
    • good()
    • eof()
    • fail()
    • bad()
  • 예시
int number;
cin >> number
입력값eofbitfailbit비고
456abcunsetunset456까지 읽고 a위치에서 멈춤
456(un)setunset456까지 읽고1) 6뒤가 newline 이면 eofbit unset 2) 6뒤가 eof이면(파일입력) eofbit set
abcunsetset값을 읽지 못하고 a위치에서 멈춤
eofsetset

입력 버리기(Discarding Input)

  • stream 상태가 좋지 않을 때 입력을 버리고 다시 진행할 경우가 있음
//clear()
//스트림을 좋은 상태(good state)로 돌려줌

cin.clear();

//ignore()
// 파일 끝에 도달하거나 지정한 수만큼 문자를 버리고 멈춤

cin.ignore(); // 문자 1개를 버림
cin.ignore(10); // 문자 10개를 버림

cin.ignore(10, '\n'); // 10개를 버리는데 단, 그전에 뉴라인문자를 버리면 멈춤
cin.ignore(LLONG_MAX, '\n'); // 최대 문자 수를 버림. 단, 그전에 뉴라인문자를 버리면 멈춤

//get()
// 뉴라인 문자를 만나기 직전까지의 모든 문자를 가져옴
// 뉴라인 문자는 입력 스트림에 남아 있음

get(firstname, 100); // 99개의 문자를 가져오거나(null 포함 100개), 뉴라인 문자가 나올때 까지 
get(firstname, 100, '#'); // 99개의 문자를 가져오거나, #문자를 만날때 까지

//getline()
// 뉴라인 문자를 만나기 직전까지의 모든 문자를 가져옴
// 뉴라인 문자는 입력 스트림에서 버림!
getline(firstname, 100);
getline(firstname, 100, '#');
profile
FLOW & VECTOR

0개의 댓글