printf(...)
zwraca liczbę znaków wyprowadzanych na konsolę, co jest bardzo pomocne przy projektowaniu niektórych programów. Tak, zastanawiałem się, czy istnieje podobna funkcja w C++, ponieważ cout < < jest operatorem bez typu zwrotnego (przynajmniej z tego, co rozumiem).Czy istnieje prosty sposób uzyskania liczby znaków drukowanych w C++?
8
A
Odpowiedz
5
Możesz skojarzyć własne streambuf
z cout
, aby policzyć znaki.
Jest to klasa, która zawija wszystko:
class CCountChars {
public:
CCountChars(ostream &s1) : m_s1(s1), m_buf(s1.rdbuf()), m_s1OrigBuf(s1.rdbuf(&m_buf)) {}
~CCountChars() { m_s1.rdbuf(m_s1OrigBuf); m_s1 << endl << "output " << m_buf.GetCount() << " chars" << endl; }
private:
CCountChars &operator =(CCountChars &rhs) = delete;
class CCountCharsBuf : public streambuf {
public:
CCountCharsBuf(streambuf* sb1) : m_sb1(sb1) {}
size_t GetCount() const { return m_count; }
protected:
virtual int_type overflow(int_type c) {
if (streambuf::traits_type::eq_int_type(c, streambuf::traits_type::eof()))
return c;
else {
++m_count;
return m_sb1->sputc((streambuf::char_type)c);
}
}
virtual int sync() {
return m_sb1->pubsync();
}
streambuf *m_sb1;
size_t m_count = 0;
};
ostream &m_s1;
CCountCharsBuf m_buf;
streambuf * const m_s1OrigBuf;
};
i używasz go tak:
{
CCountChars c(cout);
cout << "bla" << 3 << endl;
}
Chociaż istnieje instancja obiektu liczy wszystkie znaki wyjście przez cout.
Należy pamiętać, że będzie to liczyć tylko wydruki znaków przez cout
, a nie znaki wydrukowane przy użyciu printf
.
1
Można utworzyć bufor filtrujący strumień, który zgłasza liczbę zapisanych znaków. Na przykład:
class countbuf
: std::streambuf {
std::streambuf* sbuf;
std::streamsize size;
public:
countbuf(std::streambuf* sbuf): sbuf(sbuf), size() {}
int overflow(int c) {
if (traits_type::eof() != c) {
++this->size;
}
return this->sbuf.sputc(c);
}
int sync() { return this->sbuf->pubsync(); }
std::streamsize count() { this->size; }
};
Można by po prostu użyć tego bufor strumienia jako filtr:
int main() {
countbuf sbuf;
std::streambuf* orig = std::cout.rdbuf(&sbuf);
std::cout << "hello: ";
std::cout << sbuf.count() << "\n";
std::cout.rdbuf(orig);
}
Powiązane problemy
- 1. Czy istnieje prosty lub piękny sposób na odwrócenie ciągu znaków?
- 2. Czy istnieje prosty sposób implementacji AutoResetEvent w C++ 0x?
- 3. Czy istnieje sposób uzyskania informacji o GPU?
- 4. Zautomatyzuj pimpl'ing klas C++ - czy istnieje prosty sposób?
- 5. Czy istnieje prosty sposób porównywania wystąpień BufferedImage?
- 6. Czy istnieje prosty sposób uzyskania wyników JavaScript w Javie (przy użyciu Eclipse)?
- 7. Parsowanie ciągu znaków w języku C#; czy istnieje czystszy sposób?
- 8. AS3: Prosty sposób uzyskania numeru ramki etykiety ramki
- 9. Prosty sposób na sprawdzenie dużej liczby podobnych warunków?
- 10. Czy istnieje prosty sposób na uzyskanie rozmiaru obiektu java?
- 11. Czy istnieje prosty sposób rejestrowania zamknięć statycznych w Castle Windsor?
- 12. Czy istnieje prosty sposób przekształcenia tabeli MySQL w odpowiednik Redis?
- 13. Czy istnieje prosty sposób na ocenę JavaScript w WebStorm?
- 14. Czy istnieje prosty sposób na autouzupełnianie bloków zmiennych w Xcode?
- 15. Czy istnieje prosty sposób na uzyskanie wymiarów obrazu w Ruby?
- 16. Czy istnieje prosty sposób tworzenia niestandardowych typów w Powershell?
- 17. Czy istnieje prosty sposób tworzenia aliasu poleceń w mysql?
- 18. Czy istnieje prosty sposób na wykonywanie wielowierszowych ciągów w Ruby?
- 19. Czy istnieje prosty sposób przekonwertowania ciągu znaków na inetadres w języku Java?
- 20. Czy istnieje sposób wyzwalania przesunięcia myszy i uzyskania zdarzenia.pageX, event.pageY?
- 21. Czy istnieje skuteczniejszy sposób uzyskania metody z adnotacjami?
- 22. Czy istnieje statyczny sposób uzyskania HttpServletRequest bieżącego żądania?
- 23. Czy istnieje prostszy sposób uzyskania wartości frontend atrybutu?
- 24. Czy istnieje sposób uwzględnienia większej lub mniejszej liczby znaków w pliku XML?
- 25. SQL: Czy istnieje sposób na uzyskanie średniej liczby znaków w polu?
- 26. Czy istnieje sposób statycznego wykonywania wiązania C#?
- 27. Czy istnieje sposób liczenia tokenów w C?
- 28. Czy istnieje prosty sposób utworzenia tabeli wyszukiwania javascript?
- 29. Czy istnieje prosty sposób konwertowania wartości logicznej na liczbę całkowitą?
- 30. Czy istnieje prosty sposób utworzenia fragmentu przycisku akcji?
Myślę, że najlepiej jest wyjście do bufora pamięci (z 'ostringstream'), policzyć je, a następnie wyprowadzanie tego bufora na konsolę –
Zawsze uważałem, że skomplikowane formatowanie jest łatwiejsze dzięki starym szkolnym funkcjom języka C. Czy istnieje jakiś szczególny powód, dla którego chcesz uniknąć printf? –
Ups, przepraszam. Nie wiedziałem nawet, że printf działa w C++, pomyślał, że musi to być Cout <<. – Della