Jaki jest najprostszy sposób zapisu na standardowe wyjście przy użyciu tablicy znaków? Chcę wyprowadzić kawałek znacznie większej tablicy, a plaster nie jest zakończony wartością NULL. Chcę uniknąć kopiowania plasterka do "właściwego" łańcucha znaków zakończonego znakiem NUL.Zapisywanie na stdout przy użyciu tablicy znaków (bez znaku null) c/C++
Odpowiedz
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ę.
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
@ZacHowland:" Po prostu "? –
jak to jest prostsze niż 'std :: cout.write (buffer + startpos, length)'? – chowey
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, ""));
+1 za użycie kopii ... -1, aby wykonać ją najpierw w pętli. –
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;
Co za ... DLACZEGO !? lol –
To się nie skompiluje. – Simple
Nie, brakuje w nim średnika;) –
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.
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
.
"std :: copy" jest właściwe. – chris