2012-01-21 3 views
0

파일에 데이터를로드/저장하기 위해 작업중인 프로젝트의 경우 다른 파일 io 라이브러리에 비해 일부 기능 때문에 iostream 라이브러리를 구현하기로 결정했습니다. 이러한 기능 중 하나는 파생 된 fstream 또는 stringstream 클래스를 사용하여 파일 또는 메모리에 이미 존재하는 장소에서 데이터를로드 할 수있는 기능입니다. 지금까지 하나의 주요한 후퇴가 있었지만 잠시 동안 정보를 얻는데 어려움을 겪고있었습니다.C++ iostream 클래스 잘라 내기

POSIX 라이브러리에서 사용할 수있는 기능과 비슷하게 truncate 또는 ftruncate 함수의 구현을 찾고있었습니다. 문자열 스트림의 경우, 다른 크기로 다시 생성 한 후에 연관된 문자열을 다시 스트림으로 전달하는 것만 큼 쉽습니다. fstream의 경우,이 클래스에서 파일 핸들을 가져올 방법을 찾을 수 없기 때문에 실제로이 작업을 수행하는 방법을 찾지 못했습니다. 나에게 fstream 문제에 대한 해결책을 제공하는 것은 좋지만이 문제에 대한 더 나은 해결책은 iostream 친숙해야 할 것입니다. 두 스트림 클래스의 모든 사용법은 프로그램에서 iostream을 통과하기 때문에 전체 클래스를 변경하려고 할 때마다 어떤 클래스가 스트림을 제어하는지 알아 내야 만 기본 클래스를 통해 쉽게자를 수 있습니다.

다른 방법으로는 내가 찾고있는 이러한 모든 기능을 구현하는 라이브러리로 누군가를 안내 할 수 있고 iostream을 대체하는 것이 쉽지만 훌륭한 해결책이기도합니다.

편집 : 명확한 설명을 위해, 사용하고있는 iostream 클래스는 stringstream 및 fstream 클래스 만 사용하는 경향이 큽니다. 실제로 파일 자체 만 특정 지점으로 잘려야 할 필요가 있습니다. 스트림을 첨부 한 streambuf의 유형을 알 필요가없는 더 간단한 방법을 찾고있었습니다. 대답이 제안했듯이, fstream과 함께 ftruncate를 사용하는 방법을 살펴보고 두 가지 특정 경우를 처리합니다. 프로그램의 최종 사용자가 스트림 클래스를 보지 않아야합니다.

+0

당신의 목표는 무엇입니까? 스트림에 쓸 수있는 양을 제한 하시겠습니까? 이것은'std :: streambuf '필터링으로 쉽게 할 수 있습니다. 사실을 잘라낸 것은 데이터가 기록 된 위치에 따라 다르며 분명히 모든 스트림에 대해 수행 할 수 있습니다. 예를 들어, 콘솔이나 소켓에 글자를 쓴다면 다시 가져올 방법이 없습니다. –

답변

0

iostream을 잘릴 수 없습니다. 기존 스트림의 첫 번째 N 바이트를 새 스트림으로 복사해야합니다. 이는 기본 streambuf 개체의 sgetn()sputn() 메서드로 수행 할 수 있으며 iostream::rdbuf()으로 얻을 수 있습니다.

그러나이 프로세스는 I/O 집약적 일 수 있습니다. std::string을 조작하기 위해 특수한 경우를 사용하는 것이 더 좋을 수도 있고 언급 한대로 ftruncate으로 전화하는 것이 더 좋을 수도 있습니다.

당신은 정말 공격적, 당신은 스트림에있는 기존 rdbuf 개체에 대한 포인터를 유지하는 사용자 정의 std::streambuf 파생 클래스를 생성하고 만 artifiicial 최종의 생성하기 전에 특정 지점까지 읽을 수 있도록하려면 -파일. 이것은 더 짧은 I/O 시퀀스처럼 사용자에게 보이지만 실제로 메모리 나 파일 시스템 공간을 비우지는 않습니다. (그것이 중요한 것인지 확실하지 않습니다.)

+0

당신이'rdbuf()'에서 얻은 결과를 ** 삭제 **하지 말아야한다는 것을 주목하라 : 스트림 버퍼는 파생 된 스트림 클래스 (예를 들어'std :: fstream')에 의해 소유된다고 가정한다. 'std :: filebuf'를 객체에 넣거나)'rdbuf()'를 사용하여 스트림 버퍼를 설치 한 외부 엔티티에 의해 생성됩니다. 두 경우 모두'rdbuf()'를 호출해도 소유권이 사용자에게 이전되지 않습니다! –

+0

@ DietmarKühl : 오른쪽, 죄송합니다. 그 해결책은 내가 깨달은 것보다 더 hackish하다 ... iostreams는 엉망이다. – Potatoswatter