📕 Book/모던C++입문

[모던C++입문] 1.7 I/O

테디슨 2021. 7. 3. 19:45

1.7 I / O

표준 출력

  • 표준 출력은 cput 이라는 c++ 스트림을 사용해 접근
  • cout은 << 로 표시하는 삽입 연산자와 함께 사용
  • endl은 개행 문자를 생성 '\n'으로도 표현 가능
  • endl은 버퍼를 비우고 \n 방식은 버퍼를 비우지 않는다
cout << "11 * 19 = " << 11 * 19 << endl;

//괄호가 빠지면 빌드 오류 발생
cout << (age > 65 ? "I'm a wise guy\n" : "I am still half-baked.\n");

표준 입력

  • 연산자 >>를 cin 스트림에 적용하여 처리
int age;
cin >> age;

int width, height;
cin >> width >> height;

//위의 코드와 동일하게 동작 공백으로 값을 구분
cin >> width;
cin >> height;

파일 입출력

  • ofstream : 파일에 쓰기
  • ifstream : 파일로부터 읽기
  • fstream : 파일 일기 및 쓰기
#include <fstream>

int main()
{
    ofstream square_file;
    square_file.open("squares.txt");

    //다음과 같이 한줄로 축소 가능
    ofstream square_file("squares.txt");
    for(int i = 0; i < 10; i++)
        square_file << i << "^2 = " << i * i << endl;

    square_file.close();    //스코프를 벗어날때 암시적으로 닫기에 생략 가능
}

일반적인 스트림

  • 모든 클래스는 istream, ostream, iostream 에서 파생하여 스트림으로 사용 가능
  • std에는 출력 가능한 모든 타입의 문자열을 만드는데 사용하는 stringstream을 포함
  • stringstream은 str()함수로 문자열을 반환
#include <iostream>
#include <fstream>
#include <sstream>

void write_something(std::ostream& os)
{
    os << "hello stream!!" << endl;
}

int main(int argc, char* argv[])
{
    std::ofstream myfile("example.txt");
    std::stringstream mysstream;

    write_something(std::cout);     //cout출력
    write_something(myfile);        //파일 출력
    write_something(mysstream);     //스트링 출력

    std::cout << "mysstream is : " << mysstream.str();
}

서식 지정

double pi = M_PI;
cout << "pi is " << pi << endl;
cout << "pi is " << setprecision(16) << pi << endl;
// pi is 3.14159
// pi is 3.141592653589793

cout << "pi is " << setw(30) << pi << endl;
// pi is                 3.141592653589193

cout << "pi is " << setfill('-') << left << setw(30) << pi << endl;
// pi is 3.141592653589793-------------

cout.setf(ios_base::showpos);   //양수에도 부호값 표시
cout << "pi is " << scientific << pi << endl;
// pi is +3.1415926535897931e+00

cout << "63 octal is " << oct << 63 << endl;        // 8진수
cout << "63 hexadecimal is " << hex << 63 << endl;  // 16진수
cout << "63 decimal is " << dec << 63 << endl;      // 10진수
//63 octal is 77
//63 hexadecimal is 3f
//63 decimal is 63

cout << "pi < 3 is " << (pi < 3) << endl;
cout << "pi < 3 is " << boolalpha << (pi < 3) << endl;
//pi < 3 is 0
//pi < 3 is false

cout.unsetf(ios_base::... | ios_base::... | ... );      //설정 되돌림
// preicision는 안됨 직접 이전 설정값을 돌려놔야함

I/O 오류 처리

  • 파일을 읽을 때 작성한 타입과 동일한 타입으로 읽도록 해야한다
ifstream infile("some_missing_file.xyz");
if(infile.good())
{
    //올바르게 파일이 열린 경우
}
else
{
    //파일이 존재하지 않더라도 열기 동작은 실패하지 않음
}

//예외 사용을 위해선 각 스트림에 대해 예외를 활성화 하여야 한다
cin.exceptions(ios_base::badbit | iosbase::fallbit);
cout.exceptions(ios_base::badbit | iosbase::fallbit);
ifstream infile("f.txt");
infile.exceptions(ios_base::badbit | iosbase::fallbit);
반응형