삽입 연산자 사용 및 형식 제어

이 항목에서는 형식을 제어하는 방법 및 고유 클래스에 대한 삽입 연산자를 만드는 방법을 보여 줍니다. 모든 표준 C++ 데이터 형식에 대해 미리 프로그래밍된 삽입(<<) 연산자는 출력 스트림 개체에 바이트를 보냅니다. 삽입 연산자는 정수 인수의 기본 형식을 변경하는 요소인 미리 정의된 "조작자"와 함께 작동합니다.

다음 옵션을 사용하여 형식을 제어할 수 있습니다.

출력 너비

출력을 정렬하려면 스트림에 조작자를 배치 setw 하거나 멤버 함수를 호출하여 각 항목의 출력 너비를 width 지정합니다. 이 예제에서는 너비가 10자 이상인 열의 값을 오른쪽에 맞춥니다.

// output_width.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

int main( )
{
   double values[] = { 1.23, 35.36, 653.7, 4358.24 };
   for( int i = 0; i < 4; i++ )
   {
      cout.width(10);
      cout << values[i] << '\n';
   }
}
      1.23
     35.36
     653.7
   4358.24

너비가 10자 미만인 값은 앞에 공백이 추가됩니다.

필드를 패딩하려면 지정된 너비의 fill 필드에 대한 안쪽 여백 문자 값을 설정하는 멤버 함수를 사용합니다. 기본값은 공백입니다. 숫자 열에 별표가 채워지도록 하려면 다음과 같이 이전 for 루프를 수정합니다.

for (int i = 0; i <4; i++)
{
    cout.width(10);
    cout.fill('*');
    cout << values[i] << endl;
}

endl 조작자는 줄 바꿈 문자('\n')를 대체합니다. 출력은 다음과 같습니다.

******1.23
*****35.36
*****653.7
***4358.24

동일한 줄의 데이터 요소에 대한 너비를 지정하려면 setw 조작자를 사용합니다.

// setw.cpp
// compile with: /EHsc
#include <iostream>
#include <iomanip>
using namespace std;

int main( )
{
   double values[] = { 1.23, 35.36, 653.7, 4358.24 };
   const char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
   for( int i = 0; i < 4; i++ )
      cout << setw( 7 )  << names[i]
           << setw( 10 ) << values[i] << endl;
}

width 멤버 함수는 .에서 <iostream>선언됩니다. 인수와 함께 사용하거나 다른 조작자를 사용하는 setw 경우 .를 포함 <iomanip>해야 합니다. 출력에서 문자열은 너비 6의 필드와 너비 10 필드의 정수로 인쇄됩니다.

   Zoot      1.23
  Jimmy     35.36
     Al     653.7
   Stan   4358.24

setw 값을 width 잘라내지 않습니다. 형식이 지정된 출력이 너비를 초과할 경우 전체 값이 출력되고 스트림의 전체 자릿수 설정이 적용됩니다. 둘 다 setw 다음 width 필드에만 적용됩니다. 한 필드가 출력된 후 필드 너비가 기본 동작(필요한 너비)으로 돌아갑니다. 그러나 다른 스트림 형식 옵션은 변경될 때까지 적용된 상태로 유지됩니다.

맞춤

출력 스트림은 기본적으로 오른쪽 맞춤 텍스트로 설정됩니다. 이전 예제의 이름을 왼쪽에 맞추고 숫자를 오른쪽에 맞추려면 루프를 for 다음과 같이 바꿉니다.

for (int i = 0; i <4; i++)
    cout << setiosflags(ios::left)
         << setw(6) << names[i]
         << resetiosflags(ios::left)
         << setw(10) << values[i] << endl;

출력은 다음과 같습니다.

Zoot        1.23
Jimmy      35.36
Al         653.7
Stan     4358.24

왼쪽 맞춤 플래그는 열거자와 함께 left 조작자를 사용하여 setiosflags 설정됩니다. 이 열거자는 클래스에 ios 정의되므로 참조에 접두사를 ios:: 포함해야 합니다. resetiosflags 조작자는 왼쪽 맞춤 플래그를 끕니다. 와setw는 달리width, 그 효과는 setiosflagsresetiosflags 영구적입니다.

정밀도

부동 소수점 전체 자릿수의 기본값은 6입니다. 예를 들어 숫자 3466.9768은 3466.98로 출력됩니다. 이 값이 인쇄되는 방식을 변경하려면 조작자를 setprecision 사용합니다. 조작자에는 두 개의 플래그 fixed 가 있습니다 scientific. 설정된 경우 fixed 숫자는 3466.976800으로 인쇄됩니다. 설정된 경우 scientific 3.4669773+003으로 인쇄됩니다.

맞춤에 표시된 부동 소수점 숫자를 한 자리 숫자로 표시하려면 루프를 for 다음과 같이 바꿉니다.

for (int i = 0; i <4; i++)
    cout << setiosflags(ios::left)
         << setw(6)
         << names[i]
         << resetiosflags(ios::left)
         << setw(10)
         << setprecision(1)
         << values[i]
         << endl;

이 목록이 다음과 같이 출력됩니다.

Zoot          1
Jimmy     4e+01
Al        7e+02
Stan      4e+03

과학적 표기법을 제거하려면 루프 앞에 다음 문을 삽입합니다 for .

cout << setiosflags(ios::fixed);

고정 표기법을 사용할 경우 소수점 이하 1자리로 출력됩니다.

Zoot         1.2
Jimmy       35.4
Al         653.7
Stan      4358.2

플래그ios::scientificios::fixed 변경하면 프로그램에서 다음을 출력합니다.

Zoot    1.2e+00
Jimmy   3.5e+01
Al      6.5e+02
Stan    4.4e+03

다시 소수점 이하 1자리로 출력됩니다. 둘 중 하나 ios::fixed 또는 ios::scientific 설정된 경우 전체 자릿수 값은 소수점 뒤의 자릿수를 결정합니다. 두 플래그를 모두 설정하지 않으면 전체 자릿수 값에 따라 전체 유효 자릿수가 결정됩니다. resetiosflags 조작자는 이러한 플래그를 지웁니다.

기수

dec, oct및 조작자는 입력 및 hex 출력에 대한 기본 반지름을 설정합니다. 예를 들어 출력 스트림에 조작자를 삽입 hex 하면 개체가 정수의 내부 데이터 표현을 16진수 출력 형식으로 올바르게 변환합니다. 플래그가 명확한 경우 uppercase (기본값), 그렇지 않으면 대문자로 표시됩니다. 기본 radix는 (10진수)입니다 dec .

따옴표 붙은 문자열(C++14)

스트림에 문자열을 삽입할 때 멤버 함수를 호출하여 동일한 문자열을 쉽게 다시 검색할 stringstream::str() 수 있습니다. 그러나 추출 연산자를 사용하여 스트림을 나중에 새 문자열에 삽입하려는 경우 첫 번째 공백 문자를 찾을 때 연산자가 기본적으로 중지되므로 예기치 않은 결과가 발생할 >> 수 있습니다.

std::stringstream ss;
std::string inserted = "This is a sentence.";
std::string extracted;

ss << inserted;
ss >> extracted;

std::cout << inserted;     //  This is a sentence.
std::cout << extracted;    //  This

이 동작은 수동으로 재정의할 수 있지만, 문자열 왕복을 더 편리하게 만들기 위해 C++14에서는 std::quoted 스트림 조작자를 <iomanip>에 추가합니다. 삽입 quoted() 시 문자열을 구분 기호(기본적으로 큰따옴표 ' " ' ')로 묶고 추출 시 스트림을 조작하여 최종 구분 기호가 발견될 때까지 모든 문자를 추출합니다. 포함된 따옴표는 이스케이프 문자(기본적으로 '\\')로 이스케이프됩니다.

구분 기호는 스트림 개체에만 존재합니다. 추출된 문자열에는 없지만 반환된 문자열 basic_stringstream::str에 있습니다.

삽입 및 추출 작업의 공백 동작은 문자열이 코드에서 표현되는 방식에 독립적이므로 따옴표 붙은 연산자는 입력 문자열이 원시 문자열 리터럴인지 또는 일반 문자열인지에 관계없이 유용합니다. 입력 문자열은 형식에 관계없이 따옴표, 줄 바꿈, 탭 등을 포함할 수 있으며 이러한 모든 항목은 조작자에 의해 quoted() 유지됩니다.

자세한 내용 및 전체 코드 예제는 다음을 참조하세요 quoted.

참고 항목

출력 스트림