Как подсчитать количество символов, которые выводятся на печать? - PullRequest
4 голосов
/ 14 января 2010

Кто-нибудь знает, как я могу распечатать и посчитать количество напечатанных символов?

Скажем, у меня есть номер, который я печатаю через printf или cout. Как я могу подсчитать фактическое количество напечатанных цифр?

Ответы [ 5 ]

9 голосов
/ 14 января 2010

Согласно странице printf man printf возвращает количество напечатанных символов.

int count = printf("%d", 1000);

Если обнаружена ошибка вывода, возвращается отрицательное значение.

7 голосов
/ 14 января 2010

printf возвращает количество напечатанных символов

3 голосов
/ 15 января 2010

Вот еще один творческий способ злоупотребления Locale для подсчета за чувствами.
Это позволяет вам использовать поток в обычном режиме, и локальный будет записывать вывод для вас.

Это не готовый к работе код, а просто подтверждение концепции, показывающей, как это можно сделать:

#include <locale>
#include <iostream>
#include <fstream>

class Counter: public std::codecvt<char,char,std::char_traits<char>::state_type>
{
    public:
    Counter(int& count)
        :m_count(&count)
    {}
    private:
    typedef std::codecvt<char,char,std::char_traits<char>::state_type> MyType;
    typedef MyType::state_type          state_type;
    typedef MyType::result              result;

    virtual bool   do_always_noconv() const throw()
    {
        return false;
    }
    virtual result do_out ( state_type& state,
                    const char* fr, const char* fe, const char*& fn,
                    char*       to, char*       te, char*&       tn ) const
    {
        // Count the number of characters that will be out on the stream
        (*m_count) += (fe - fr);

        // Use the default do_out (which just copies when internal and external are char)
        return MyType::do_out(state,fr,fe,fn,to,te,tn);
    }
    private:
        int*    m_count;

};




int main()
{
    // The variable to store the count in
    int             count   = 0;
    // A local object that contains the counting facet.
    // The counting facet will record output into count.
    std::locale     countingLocale(std::cout.getloc(), new Counter(count));

    std::ofstream   data;
    data.imbue(countingLocale);   // Impue the stream before opening.
    data.open("Plop");
    data << "Stop" << std::endl;

    std::cout << "Count: " << count  << "\n";

    // This should also work with std::cout
    std::cout.imbue(countingLocale)
    // Unfortunately there is a bug in the locale code for me that stops this working.

}
0 голосов
/ 30 апреля 2010

Используйте строковый поток для предварительного преобразования, затем опрашивайте его для длины.

0 голосов
/ 14 января 2010

Если вы хотите использовать ostream, pcount() возвращает количество введенных символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...