2013-08-28 4 views

Odpowiedz

13

Istnieje dość oczywiste rozwiązanie, którego początkowo nie znalazłem. std::cout jest instancją ostream.

void WriteChunk(char *buffer, size_t startpos, size_t length) { 
    std::cout.write(buffer + startpos, length); 
} 

, więc std::cout.write załatwia sprawę.

+1

Ty * możesz * zrobić to w ten sposób ... lub możesz po prostu użyć 'std :: copy':' std :: copy (bufor, bufor + yet_many_characters_you_want, std :: ostream_iterator

+8

@ZacHowland:" Po prostu "? –

+1

jak to jest prostsze niż 'std :: cout.write (buffer + startpos, length)'? – chowey

1

Jeśli znasz granice tablicy znaków wtedy można napisać:

char* arr = new char[N]; 
for(size_t i = min_indx; i < max_indx; ++i) { 
    cout << arr[i]; 
} 

Musisz tylko upewnić min_indx jest pomiędzy 0 a n-1 oraz max_indx wynosi od 0 do N.

Ponieważ wszystkie funkcje biblioteczne, jak robić rzeczy, oto sposób to zrobić przy użyciu std::copy:

copy(arr + min_indx, arr + max_indx, ostream_iterator<char>(cout, "")); 
+0

+1 za użycie kopii ... -1, aby wykonać ją najpierw w pętli. –

1

Ok, jest to „dział dla głupich pomysłów”:

class partial_print_wrapper 
{ 
    private: 
    const char *str; 
    int start; 
    int end; 
    public: 
    partial_print_wrapper(const char *s, int st, int en) : str(s), start(st), end(en) {} 
    friend ostream& operator <<(ostream &os, const partial_print_wrapper& pw); 
}; 

ostream& operator <<(ostream &os, const partial_print_wrapper& pw) 
{ 
    for(int i = pw.start; i < pw.end; i++) 
    { 
     os << pw.str[i]; 
    } 
    return os; 
} 

char *s = "Something quite long"; 

cout << print_string_wrapper(s, 3, 8) << endl; 
+2

Co za ... DLACZEGO !? lol –

+0

To się nie skompiluje. – Simple

+0

Nie, brakuje w nim średnika;) –

4

std::copy wydaje się dokładnie to, co chcesz:

#include <iostream> // for std::cout 
#include <algorithm> // for std::copy 
#include <iterator> // for std::ostream_iterator 

//... 
char arr[] = "abcdefij"; 

std::copy(arr + 2, arr + 5, std::ostream_iterator<char>(std::cout, "")); 

Ten przykład pisać na standardowe wyjście: cde.

Here to przykład na żywo.

1

ostream::write powinien działać.

#include <iostream> 
int main() { 
    char a[] = "ABCDEFGHIJ"; 
    std::ostream out(std::cout.rdbuf()); 
    out.write(a, 2); 
} 

Edit

Tworzenie osobnego przedmiotu ostream nie jest wymagane, ponieważ std::cout jest sam obiekt ostream. Tak więc wystarczy std::cout.write.