Loading the catalog…
Loading the catalog…
출력 스트림 출력 스트림은 <ostream> 헤더 파일에 정의되어 있다. 프로그램을 작성할 때 흔히 인클루드하는 <iostream> 헤더에는 입력과 출력 스트림이 모두 정의되어 있다. <iostream> 에는 미리 정의된 스트림 인스턴스인 cout , cin , cerr , clog 와 각각에 대한 와이드 문자 버전 도 있다. 출력 스트림 을 사용하는 가장 간편한 방법은 << 연산자 를 이용하는 것이다. int, 포인터, double, char을 비롯한 C++ 기본 타입은 모두 << 로 출력할 수 있다. 또한 C++의 string 클래스 뿐만 아니라 C 스타일 스트링도 << 로 처리할 수 있다. << 의 사용 예를 몇 가지 들면 다음과 같다. int i = 7; cout << i << endl; char ch = 'a'; cout << ch << endl; string myString = "Hello World."; cout << myString << endl; 이 코드를 실행하면 다음과 같이 출력된다. 7 a Hello World. cout 스트림 은 C++에서 기본으로 제공하는 내장(built-in) 스트림 으로 콘솔(표준 출력, standard output) 에 값을 쓴다. 여러 조각으로 된 데이터를 하나로 합쳐서 출력할 때도 << 연산자를 사용한다. << 연산자는 스트림에 대한 레퍼런스 를 리턴하기 때문에 그 결과를 동일한 스트림의 << 연산자에 연달아 적용할 수 있다. 예를 들면 다음과 같다. int j = 11; cout << "The value of j is" << j << "!" << endl; 이 코드를 실행하면 다음과 같이 출력된다. The value of j is 11; C++ 스트림은 C 스타일의 스트링에 담긴 \n 과 같은 이스케이프 시퀀스(탈출/이탈 문자열, escape sequence) 도 정확히 처리한다. 이때 줄바꿈하는 부분을 \n 대신 std::endl 로 표현해도 된다. \n 은 단순히 새 줄을 시작하는 데 반해 endl 은 버퍼를 내보내는 플러시(flush) 연산도 수행한다. 단, 플러시 연산이 너무 많으면 성능이 떨어질 수 있으니 endl 을 조심해서 사용해야 한다. 예를 들어 endl 을 사용하려 텍스트를 여러 줄에 걸쳐서 출력하면서 매번 버퍼를 내보내는 작업을 한 문장으로 표현하면 다음과 같다. cout << "Line 1" << endl << "Line 2" << endl << "Line 3" << endl; 이 문장을 실행하면 다음과 같이 출력된다. Line 1 Line 2 Line 3 ※ endl은 목적지 버퍼를 내보낸다. 따라서 복잡한 루프문과 같이 성능에 민감한 코드에서는 주의해서 사용해야 한다. 출력 스트림 메서드 출력 스트림에서 가장 대표적인 연산자는 << 다. 그런데 이 연산자는 출력 기능 외에도 다양한 기능을 제공한다. <ostream> 헤더 파일에서 << 연산자를 오버로딩으로 정의한 코드를 보면 온갖 종류의 데이터 타입에 대한 출력 기능을 제공하는 것을 알 수 있다. 그 밖에도 <ostream> 에서 제공하는 유명한 public 메서드 중 몇 가지만 살펴보면 다음과 같다. put()과 write() put() 과 write 는 저수준 출력 메서드로서 출력 동작을 갖춘 객체나 변수를 인수로 받지 않고, 문자 하나를 받거나( put() 의 경우), 문자 배열 하나를 인수로 받는다( write() 의 경우). 이 메서드는 전달된 데이터에 특정한 포맷을 적용하거나 데이터의 내용을 가공하지 않고 본래 상태 그대로 출력한다. 예를 들어 << 연산자를 사용하지 않고 C 스타일 스트링을 콘솔에 출력하려면 다음과 같이 작성한다. const char* test = "hello there\n"; cout.write(test, strlen(test)); put() 메서드로 문자 하나를 콘솔에 출력하는 방법은 다음과 같다. cout.put('a'); flush() 출력 스트림에 데이터를 쓰면 목적지에 즉시 전달되지 않을 수도 있다. 일반적으로 출력 스트림은 들어온 데이터를 곧바로 쓰지 않고 버퍼(buffer) 에 잠시 쌓아두는데, 이렇게 하면 대체로 성능을 높일 수 있다. 목적지가 파일과 같은 스트림일 때는 한 문자씩 처리하기보다는 블록 단위로 묶어서 처리하는 것이 훨씬 효율적이다. 그러다가 다음과 같은 조건을 만족하면 그동안 쌓아둔 데이터를 모두 내보내서 버퍼를 비운다. 이 동작을 제공하는 메서드가 바로 flush() 이다. endl 과 같은 경곗값에 도달할 때 스트림이 스코프를 벗어나 소멸될 때 스트림 버퍼가 가득 찼을 때 flush() 를 호출해서 스트림 버퍼를 명시적으로 비울 때 출력 스트림에 대응되는 입력 스트림으로부터 요청이 들어올 때 (예를 들어 cin 으로 입력받으면 cout 의 버퍼를 비움). flush() 메서드를 호출해서 스트림 버퍼의 내용을 명시적으로 내보내려면 다음과 같이 작성한다. cout << "abc"; cout.flush(); // 콘솔에 abc가 출력된다. cout << "def"; cout.flush(); // 콘솔에 def가 출력된다. ※ 출력 스트림이라고 해서 모두 버퍼를 사용하는 것은 아니다. 예를 들어 cerr 스트림은 버퍼를 사용하지 않고 출력한다. 출력 에러 처리 출력 에러(ouput error) 가 발생하는 경우는 다양하다. 예를 들어 존재하지 않는 파일을 열려고 하거나 디스크가 꽉 차서 쓰기 연산을 처리할 수 없으면 에러가 발생한다. 이런 발생 가능한 모든 에러에 항상 대처하도록 코드를 작서아는 것이 바람직하다. good() 메서드는 스트림을 정상적으로 사용할 수 있는 상태인지 확인한다. 사용법은 다음과 같이 스트림에 대해 곧바로 호출하면 된다. if (cout.good()) { cout << "All good" << endl; } good() 메서드를 이용하면 스트림의 상태 정보를 조회할 수 있다. 하지만 사용할 수 없는 상태일 때는 그 원인을 구체적으로 알려주지 않는다. 이런 정보는 bad() 메서드로 자세히 볼 수 있다. bad() 메서드가 true를 리턴한다는 것은 심각한 에러가 발생했다는 뜻이다 (반면 파일의 끝에 도달했는지 확인하는 eof() 가 true라는 것은 심각한 상태가 아니다). 또한 fail() 메서드를 사용하면 최근 수행한 연산에 오류가 발생했는지 확인할 수 있다. 그러나 그 뒤에 일어날 연산의 상태는 알려주지 않기 때문에 fail() 의 리턴값에 관계없이 후속 연산이 성공적으로 수행될 수도 있고 아닐 수도 있다. 예를 들어 출력 스트림에 대해 flush() 를 호출한 뒤 fail() 을 호출하면 바로 직전의 flush() 연산이 성공했는지 확인할 수 있다. cout.flush(); if (cout.fail()) { cerr << "Unable to flush to standard out" << endl; } 스트림을 bool 타입으로 변환하는 연산자도 있다. 이 연산자는 fail() 을 호출할 때와 똑같은 결과를 리턴한다. 따라서 위의 코드를 다음과 같이 작성해도 된다. cout.flush(); if (!cout) { cerr << "Unable to flush to standard out << endl; } 여기서 주의할 점은 good() 과 fail() 은 스트림이 파일 끝에 도달할 때도 false를 리턴한다는 것이다. 이 관계를 코드로 표현하면 다음과 같다. good() == (!fail() && !eof()) 스트림에 문제가 있으면 익셉션을 던지도록 만들 수도 있다. ios_base::failure 익셉션 을 처리하도록 catch 문을 작성하면 된다. 이 익셉션에 대해 what() 메서드를 호출하면 현재 발생한 에러에 대한 정보 를 볼 수 있고, code() 를 호출하면 에러 코드 를 볼 수 있다. 하지만 얼마나 쓸모 있는 정보를 제공하는지는 표준 라이브러리의 구현에 따라 달라진다. cout.exceptions(ios::failbit | ios::badbit | ios::eofbit); try { cout << "Hello World." << endl; } catch (const ios_base::failure& ex) { cerr << "Caught exception: " << ex.what() << ", error code = " << ex.code() << endl; } exceptions()는 스트림에서 어떤 에러 상태가 발생했을 때 익셉션을 던질지 설정하거나 조회하는 메서드이다. 스트림의 에러 상태를 초기화하려면 clear() 메서드를 호출한다. cout.clear(); 출력 매니퓰레이터 C++의 스트림은 단순히 데이터만 전달하는 데 그치지 않고 매니퓰레이터(manipulator) 라는 객체를 받아서 스트림의 동작을 변경할 수도 있다. 이때 스트림의 동작을 변경하는 작업만 할 수도 있고, 스트림에 데이터를 전달하면서 동작도 변경할 수 있다. 흔히 보았던 endl 이 바로 매니퓰레이터이다. endl 은 데이터와 동작을 모두 담고 있다. 그러므로 스트림에 전달될 때 줄끝(end-of-line, EOL) 문자를 출력하고 버퍼를 비운다. 몇 가지 유용한 매니퓰레이터를 소개하면 다음과 같다. 대부분 <ios> 나 <iomanip> 표준 헤더 파일에 정의되어 있다. boolalpha 와 noboolalpha : 스트림에 bool 값을 true나 false로 출력하거나( boolalpha ), 1이나 0으로 출력하도록( noboolalpha ) 설정한다. 기본값은 noboolalpha 다. hex , oct , dec : 각각 숫자를 16진수, 8진수, 10진수로 출력한다. setprecision : 분숫값을 표현할 때 적용할 소수점 자릿수를 지정한다. 이를 위해 자릿수를 표현하는 인수를 받는다. setw : 숫자 데이터를 출력할 필드의 너비를 지정한다. 이 매니퓰레이터도 인수를 받는다. setfill : 지정된 너비보다 숫자가 작을 때 빈 공간을 채울 문자를 지정한다. 이 매니퓰레이터도 인수를 받는다. showpoint 와 noshowpoint : 스트림에서 분수 부분이 없는 부동소수점수를 표현할 때 소수점 표시 여부를 설정한다. put_money : 스트림에서 화폐 금액을 일정한 형식에 맞게 표현할 때 사용한다. 이 매니퓰레이터도 인수를 받는다. put_time : 스트림에서 시간을 일정한 형식에 맞게 표현할 때 사용한다. 이 매니퓰레이터도 인수를 받는다. quoted : 주어진 문자열을 인용 분호(따옴표)로 감싸고, 문자열 안에 있던 인용 부호를 이스케이프 문자로 변환한다. 이 매니퓰레이터도 인수를 받는다. 여기서 소개하는 매니퓰레이터는 모두 한 번 설정되면 명시적으로 리셋하기 전까지 다음 출력에 계속 반영된다. 단 setw 는 바로 다음 출력에만 적용된다. 이 매니퓰레이터들로 출력 형태를 커스터마이즈하는 예는 다음과 같다. // 부울값 bool myBool = true; cout << "This is the default: " << myBool << endl; cout << "This should be true: " << boolalpha << myBool << endl; cout << "This should be 1: " << noboolalpha << myBool << endl; // "%6d"와 같은 효과를 스트림에 적용하는 방법 int i = 123; printf("This should be ' 123': %6d\n", i); cout << "This should be ' 123': " << setw(6) << i << endl; // "%06d"와 같은 효과를 스트림에 적용하는 방법 printf("This should be '000123': %06d\n", i); cout << "This should be '000123': " << setfill('0') << setw(6) << i << endl; // *로 채우기 cout << "This should be '***123': " << setfill('*') << setw(6) << i << endl; // 빈칸 채우기 문자 리셋 cout << setfill(' '); // 부동소수점수 double dbl = 1.452; double dbl2 = 5; cout << "This should be ' 5': " << setw(2) << noshowpoint << dbl2 << endl; cout << "This should be '@@1.452': " << setw(7) << setfill('@') << dbl << endl; // 빈칸 채우기 문자 리셋 cout << setfill(' '); // cout에서 숫자 포맷을 지역(국가)에 맞게 설정한다. cout.imbue(locale("")); // 현재 지역(국가)에 맞게 숫자를 표현한다. cout << "This is 1234567 formatted according to your location: " << 1234567 << endl; // 화폐 금액을 표기한다. 정확한 액수는 현재 지역(국가)에 맞게 표현한다. // 예를 들면 미국이라면 12000은 12000 센트를 의미한다. // 이를 달러 단위로 표현하면 1200.00이다. cout << "This should be a monetary value of 12000, " << "formatted according to your location: " << put_money("120000") << endl; // 날짜와 시간 time_t t_t = time(nullptr); // 현재 시스템 시각 tm* t = localtime(&t_t); // 현지 시각으로 변환 cout << "This should be the current date and time " << "formatted according to your location: " << put_time(t, "%c") << endl; // 인용 부호로 묶은 스트링 cout << "This should be: \"Quoted string with \\\"embedded quotes\\\".\\": " << quoted("Quoted string with \"embedded quotes\".") << endl; ※ localtime()을 호출할 때 보안 에러나 경고가 발생할 수 있다. 마이크로소프트 비주얼 C++는 좀 더 안전한 버전인 localtime_s()를 제공한다. 리눅스에는 localtime_r()이 있다. 매니퓰레이터를 쓰고 싶지 않다면 같은 효과를 내는 다른 방법이 있다. 스트림에서 제공하는 매니퓰레이터와 동등한 메서드 (예: precision() )를 사용하면 된다. 예를 들어 다음과 같은 문장이 있다고 하자. cout << "This should be '1.2346': " << setprecision(5) << 1.23456789 << endl; 이 문장 대신에 다음과 같이 precision() 을 호출하도록 작성해도 된다. 이 메서드는 이전에 설정된 값을 리턴하기 때문에 그 값을 저장해두면 얼마든지 이전 상태로 되돌릴 수 있다. cout.precision(5); cout << "This should be '1.2346': " << 1.23456789 << endl; 【 본 포스팅은 '전문가를 위한 C++ (개정 5판)'을 참고하여 작성되었습니다. 】
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
[C++ 80] - 스트림을 이용한 출력. 출력 스트림 출력 스트림은 헤더 파일에 정의되어 있다. 프로그램을 작성할 때 흔히 인클루드하는 헤더에는 입력과 출력 스트림이 모두 정의되어 있다. 에는 미리 정의된 스트림 인스턴스인 cout , cin , cerr , clog 와 각각에 대한 와이드 문자 버전 도 있다. 출력 스트림 을 사용하는 가장 간편한 방법은 헤더 파일에서 에서 제공하는 유명한 public 메서드 중 몇 가지만 살펴보면 다음과 같다. put()과 write() put() 과 write 는 저수준 출력 메서드로서 출력 동작을 갖춘 객체나 변수를 인수로 받지 않고, 문자 하나를 받거나( put() 의 경우), 문자 배열 하나를 인수로 받는다( write() 의 경우). 이 메서드는 전달된…
Open source