2012-08-15 2 views
6

요약하면 파이프는 파괴적인 읽기가있는 스트림/FIFO 스타일 컨테이너입니다. 한 번에 데이터 덩어리를 모두 복사하고 getput과 같은 기능을 단일 바이트에 대해 수행하는 방법은 read()입니다. read 또는 get이 반환되면 파일에서 복사 된 데이터가 파일 또는 다른 컨테이너 유형과 달리 파이프의 내부 버퍼에서 제거됩니다.파이프처럼 작동하는 C++ STL 클래스가 있습니까?

STL 컨테이너의 대부분 (모두?)은 버퍼 명령에 유사한 read()을 제공하지 않습니다. pop_many() 회원이있는 fifo 컨테이너 유형이 있습니까?

stringstream은 스트림이 채워질 때까지 내부 읽기 포인터와 향후 읽기가 유지되므로 생각할 수있는 가장 가까운 것입니다. 컨테이너는 API 관점에서 비어 있지만 소비 된 데이터는 수동으로 가비지 수집해야합니다.

C++에서 이와 동일한 컨테이너 또는 스트림 클래스가 있습니까? 아니면 롤업 예 (stringstream 예와 같이) 문제입니까?

+4

아마도 대기열에 있습니까? – Gir

+2

queue.pop() 주위에 루프를 넣을 수는 있지만 효율적이지 않습니다. 나는 큰 덩어리의 데이터를 제거 할 수 있기를 원하며 큐/FIFO는 제거한 후에 자동으로 크기가 조정됩니다. –

+2

무엇이 필요합니까? –

답변

1

의견에 이미 std::deque이 언급되어 있습니다. 언뜻보기에 이것이 최선의 선택입니다.

그래도 문제가 해결되지 않으면 std::list<std::vector<unsigned char> >을 사용해보세요. 한 번에 하나의 벡터에 청크를 넣고 튀어 나오면 splice을 다른 목록에 씁니다. 소량의 편리한 래퍼 코드를 제공해야하며, 이 없으면 하위 벡터 중 하나의 요소를 모두 한 번에 읽으려는 경우 충분하지 않을 수 있습니다.

+0

기본적으로 API는 다음과 같이 작동합니다. 사용자가 파일 설명자에서 메시지를 기다리는 중입니다. 메시지가 도착하면 Read 메서드를 호출하여 첫 ​​번째 바이트가 메시지 유형 (즉 메시지의 나머지 길이)을 결정한 다음 통과합니다 주변의 객체와 응용 프로그램의 여러 부분에서 Read 메소드를 사용하여 데이터를 char * 버퍼로 읽습니다. 그래서, 지금은'std :: stringstream'을보고 있습니다. 왜냐하면 그것은 read (char *, int) 메쏘드를 주며, 자동으로 get 포인터를 감소시킵니다. 또한 응용 프로그램이 더 많은 데이터를 읽으려고 시도하는 경우 차단하지 않는 readsome() 메소드도 제공합니다. –

+0

BTW, 내 API가 아님. 나는 결코 그렇게하지 않을 것이다! –