SW/C++

C++11 : 표준입출력에 대해 알아볼까요?

얇은생각 2018. 12. 17. 12:30
반응형

컴퓨터 장치는 외부 장치와 소통해야 합니다. 따라서 입력과 출력 인터페이스를 제공합니다. 컴퓨터 장치는 키보드 입력과 모니터 출력을 주요 입출력 인터페이스로 사용하고 있습니다. 


C++에서는 다른 프로그래밍 언어와 마찬가지로 입출력을 쉽게 할 수 있는 클래스 라이브러리를 제공하며 기본 기능으로 std 표준 라이브러리에 포함했습니다.

뿐만 아니라 파일에 읽고 쓰는 것도 중요한 입출력 인터페이스입니다.

우리는 개발을 하면서 설정 파일을 쓰며 동적으로 읽고 변경된 사항을 반영하기 때문입니다.



입출력의 시작

C++은 scanf()와 printf() 함수 대신 cin, cout 클래스를 제공합니다.

가능하면 C++에서는 scanf()와 printf() 함수를 사용하지 맙시다.

키보드와 모니터 입출력을 위한 헤더와 네임스페이스는 다음과 같습니다.


필요한 라이브러리 헤더 : iostream(입출력 클래스)

네임스페이스 : std(표준 라이브러리)


// scanf와 printf를 이용한 C 예제
#include <studio.h>
 
 
int main()
{
    int number = 0;
    scanf("%d"&number); // 키보드 숫자 입력
    printf("모니터 출력: %d \n", number);
}
cs


// cin과 cout을 이용한 C++ 예제
#include <iostream>
using namespace std// std 네임스페이스 지정
 
int main()
{
    int number = 0;
    cin >> number;
    cout << "모니터 출력: " << number << endl;
}
cs



파일입출력

파일을 읽고 쓰는 입출력 방식에 대해 알아보겠습니다. 필요한 라이브러리 헤더와 네임스페이스는 다음과 같습니다.


필요한 라이브러리 헤더 fstream(파일 클래스)

네임스페이스 std (표준 라이브러리)


다음 예제는 file.txt에 쓰고 다시 읽어서 출력하는 코드입니다.


#include <fstream>
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string str = "파일에씁시다.";
    ofstream ofs("file.txt"); // file.txt 파일을 연다.
    ofs << str; // file.txt 파일에 str 문자열을 쓴다.
    ofs.close(); // 파일을 닫는다.
    ifstream ifs("file.txt"); // file.txt 파일을 다시 열고,
    ifs >> str; // 파일의 내용을 str에 저장한다.
    cout << str << endl// 파일로부터 읽은 내용을 모니터 화면에 출력한다.
    ifs.close(); // 파일을 닫는다.
}
cs


앞의 예제에서 파일 출력은 ofstream으로, 파일 입력은 ifstream으로 구현했다.

이는 fstream 클래스로 파일 모드를 지정해서 구현할 수 있습니다. 


ofstream -> fstream(ios::out)

ifstream -> fstream(ios::in)


 파일모드

설명 

 ios::in

 파일 읽기

 ios::out

 파일 쓰기

 ios::app

 파일에 이어쓰기

 ios::trunc

 파일이 이미 있으면 삭제하고 새로운 파일 생성

 ios::binary 

 이진 파일 처리


fstream 주요 메범 함수와 기능

멤버 함수

 기능 설명

 open(파일명)

 파일명 지정

 open(파일명, 파일모드)

 파일명과 모드 함께 지정

 is_open() 

 파일이 잘 열였는지 확인 true, false 반환

 close() 

 파일 닫기

 eof() 

 파일의 마지막 위치에 도달했는지 여부 반환, 마지막 위치면 true 반환

 fail()

  파일 존재 여부 확인, 없으면 true 반환

 tellp()

  현재 파일 쓰기 위치 반환

 seekp(streampos pos) 

 파일 쓰기 위치 설정

 flush() 

 메모리에 있는 데이터를 물리 파일에 실제 쓰기

 operator << 

  파일에 문자열 쓰기

 put(cahr c) 

 파일에 문자 쓰기

 write(const char* s, streamsize n) 

 파일에 정해진 크기만큼 문자열 쓰기

 tellg() 

  현재 파일의 읽기 위치 반환

 seekg(steampos pos) 

 파일로부터 문자열 읽기

 operator >> 

 파일로부터 문자열 읽기

 get(char& c) 

  파일의 문자 읽기

 getline(char* s, streamsize n) 

 파일로부터 최대 정해진 크기만큼 줄의 문자열 읽기


this is an apple 문자열을 this is a sample로 문자열을 변경한 예제입니다.

이 예제를 응용하면 파일을 읽을 때 tellg() 멤버 함수도 쉽게 활용할 수 있습니다.

또 랜덤 액세스 입출력도 구현할 수 있습니다.


#include <fstream>
using namespace std;
 
int main ()
{
    ofstream ofs;
    // file.txt 파일을 연다(없으면 생성).
    ofs.open ("file.txt");
    // "This is an apple" 문자열을 파일에 쓴다.
    ofs.write ("This is an apple",16);
 
    // tellp() 멤버 함수를 이용해 파일의 현재 위치를 얻는다.
    // 현재 위치는 This is an apple의 맨 끝일 것이다.
    long pos = ofs.tellp();
 
    // 현재 위치에서 7만큼 위치를 뒤로 이동시킨다.
    // 현재 위치를 앞뒤로 조정하는 것을 오프셋(offset)을 조정한다고 한다.
    // 오프셋을 -7로 조정한 위치는 문자 'n'이다.
    ofs.seekp (pos-7);
 
    // 조정한 위치부터 문자열 "sam"을 쓴다.
    ofs.write (" sam",4);
 
    // 파일을 닫는다.
    ofs.close();
 
    return 0;
}
cs


반응형