티스토리 뷰
스트림과 입출력
많은 프로그래밍 언어는 연속적인 데이터를 일련의 스트림(흐름)으로 취급합니다. C++도 예외는 아니며, 그 중 파일 읽기에 쓰이는 클래스가 ifstream
이고 파일 쓰기에 사용되는 클래스가 ofsrtream
입니다.
스트림 계열 클래스
MSDN에 따르면 스트림 계열 클래스는 주로 다음과 같습니다.
istream
,ostream
: 콘솔 입력. 보통 객체를 직접 생성하지 않고std::cin
,std::cout
을 쓴다네요.ifstream
,ofstream
: 파일 읽고 쓰기istringstream
,ostringstream
: 문자열 스트림 같아보입니다. 나중에 기회가 되면…
ifstream
ifstream
은 사실 std::basic_ifstream
의 typedef 입니다. char_traits
는 문자 자료형에 지원용 연산자들을 추가하는 무언가(*trait: 컴파일 타임 인터페이스)로 보입니다. (std::char_traits 소스: llvm libc++, g++ libstdc++)
typedef basic_ifstream<char, char_traits<char>> ifstream;
중요해보이는 메서드는 다음과 같습니다. 참조
- 생성자
- 멤버함수
operator=
- 이동 연산자open( [여러가지] filename, [모드 - 생략가능] )
,close()
- 열렸는지 체크는
operator!
나fail()
(std::basic_ios
) - 모드는 기본이
std::ios_base::in
입니다. 문서 확인바람
- 열렸는지 체크는
- 상속받은 멤버함수 (
std::basic_istream
)peek()
- 문자 추출(extract) 없이 다음 글자 내다보기getline( char_type* [저장대상버퍼], std::streamsize [버퍼길이], [선택적 char_type delim] )
- 이거 대신 아마도 주로std::getline(스트림, 버퍼)
을 쓰는 모양입니다 (자료형이 char밖에 없어서?). 특정 문자가 나올때까지 계속 읽습니다. 마지막 인자는 생략시\n
으로 오버로드.operator>>
파일 열어서 한 줄씩 모두 출력하기
#include <iostream>
#include <fstream> // ifstream에 필요합니다.
using namespace std;
/** \brief 이 소스파일을 읽어서 한 줄씩 출력합니다. */
int main () {
// 생성자로 파일을 바로 엽니다. open() 도 가능
ifstream myfile("main.cpp");
// 아무래도 C++은 읽은 걸 보관하기 위한 버퍼가 필요한 모양입니다.
string buffer;
// peek()는 스트림에서 문자를 가져오지 않은 채로 뭐가 있는지 내다봅니다.
// 파일이 끝나면 peek()는 EOF를 반환하니까...
while (myfile.peek() != EOF) {
// std::getline은 입력 스트림에서 string으로 한 줄을 읽습니다.
getline(myfile, buffer);
cout << buffer << endl;
}
}
레퍼런스
- cplusplus.com - ifstream
- 추천 cppreference.com - basic_ifstream
- MSDN - basic_ifstream
- 추천 : MSDN - iostream 프로그래밍
- 위 링크의 영어판
여담
그게… 코딩 인터뷰 책 보다가 C++로 파일 읽으라는 문제가 나오더라구요. 문제는 제가 이런 작업을 C++에서 잘 해본 적이 없어서요. 찾아보는 김에 정리해봤습니다.
노트에 먼저 손코딩으로 감으로 때려맞춰가며 풀어봤는데, 이터레이터가 나올거라고 생각했는데 그건 아니더군요. peek()
함수와 getline()
함수를 기억해둬야 할 것 같습니다.
학교 수업 때 스트림을 안 배웠던, 혹은 제대로 집중해서 안 들어서 그런지 iostream 계열의 계층구조가 놀랍습니다. 이건 시간을 내서 따로 공부를 할 건인 것 같네요. 또, 역시 C++은 어렵다는 생각이 드네요. C#이나 Java면 금방금방 했을텐데…
- std::move에 대한 이해가 필요한데 아직 제가 그게 없습니다. [본문으로]
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Oracle Cloud Infrastructure
- 오라클 클라우드 인프라
- 업비트
- 토이프로젝트
- pdf.js
- 쿠버네티스
- kotlin당했다
- javascript
- OStatus
- C#
- ArchLinuxARM
- ActivityPub
- 마스토돈
- 오라클 클라우드
- exercism
- vuex
- K8s
- upbit
- Godot Engine
- 시스어드민
- 왜 생각이 안 났지
- mvu
- C++ FAQ
- rust-lang
- 개발기록
- scss
- c++
- pleroma
- Sass
- gitea
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함