boost学习2.4:progress_diplay

progress_diplay可以在显示台显示程序执行的进度。

(1)类摘要

#include "stdafx.h"
#include<stdlib.h>
#include <vector>
#include<iostream>
#include <fstream>
#include <boost/progress.hpp>
using namespace std;
using namespace boost;
class progress_display : private noncopyable//noncopyable子类可以继承,但是禁止拷贝(即只能单例化)
{
public://explicit关键字,表示不能发生隐式转换
    explicit progress_display( unsigned long expected_count,
        std::ostream & os = std::cout,
        const std::string & s1 = "\n", //leading strings
        const std::string & s2 = "",
        const std::string & s3 = "" )
        // os is hint; implementation may ignore, particularly in embedded systems
        : m_os(os), m_s1(s1), m_s2(s2), m_s3(s3) { restart(expected_count); }

    void           restart( unsigned long expected_count )
        //  Effects: display appropriate scale
        //  Postconditions: count()==0, expected_count()==expected_count
    {
        _count = _next_tic_count = _tic = 0;
        _expected_count = expected_count;

        m_os << m_s1 << "0%   10   20   30   40   50   60   70   80   90   100%\n"
            << m_s2 << "|----|----|----|----|----|----|----|----|----|----|"
            << std::endl  // endl implies flush, which ensures display
            << m_s3;
        if ( !_expected_count ) _expected_count = 1;  // prevent divide by zero
    } // restart

    unsigned long  operator+=( unsigned long increment )
        //  Effects: Display appropriate progress tic if needed.
        //  Postconditions: count()== original count() + increment
        //  Returns: count().
    {
        if ( (_count += increment) >= _next_tic_count ) { display_tic(); }
        return _count;
    }

    unsigned long  operator++()           { return operator+=( 1 ); }
    unsigned long  count() const          { return _count; }
    unsigned long  expected_count() const { return _expected_count; }

private:
    std::ostream &     m_os;  // may not be present in all imps
    const std::string  m_s1;  // string is more general, safer than
    const std::string  m_s2;  //  const char *, and efficiency or size are
    const std::string  m_s3;  //  not issues

    unsigned long _count, _expected_count, _next_tic_count;
    unsigned int  _tic;
    void display_tic()
    {
        // use of floating point ensures that both large and small counts
        // work correctly.  static_cast<>() is also used several places
        // to suppress spurious compiler warnings.
        unsigned int tics_needed =
            static_cast<unsigned int>(
            (static_cast<double>(_count)/_expected_count)*50.0 );
        do { m_os << ‘*‘ << std::flush; } while ( ++_tic < tics_needed );
        _next_tic_count =
            static_cast<unsigned long>((_tic/50.0)*_expected_count);
        if ( _count == _expected_count ) {
            if ( _tic < 51 ) m_os << ‘*‘;
            m_os << std::endl;
        }
    } // display_tic
};

(2)用法

#include "stdafx.h"
#include<stdlib.h>
#include <vector>
#include<iostream>
#include <fstream>
#include <boost/progress.hpp>
using namespace std;
using namespace boost;
int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> v(100);
    for (vector<string>::iterator& i=v.begin();i!=v.end();i++)
    {
        *i="asd";
    }

    ofstream fs("./test.txt");//打开一个文件输出流,记得包含fstrean头文件
    progress_display pd(v.size());//实例化一个显示类的基数(即进度条里最多的个数作为分母)
    for(vector<string>::iterator& x=v.begin();x!=v.end();x++)
    {
        fs<<*x<<endl;//想test写入文件
        ++pd;//更新进度条
    }
    return 0;
}

 3.注意事项

当我们想显示进度的同时还可以显示中间的一些空字符行号,当我们下面这样做时

int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> v(100,"aaa");
    v[10]="";
    v[23]="";

    ofstream fs("./test.txt");//打开一个文件输出流,记得包含fstrean头文件
    progress_display pd(v.size());//实例化一个显示类的基数(即进度条里最多的个数作为分母)
    for(vector<string>::iterator& x=v.begin();x!=v.end();x++)
    {
        fs<<*x<<endl;//想test写入文件
        ++pd;//更新进度条
        if(x->empty())
        {
            cout<<"null string #"<<(x-v.begin());
        }
    }
    return 0;
}

当我们按上面这样做时会发现:

这样会打乱我们们进度条的显示:

所以我们只能下面这样做:

// test1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdlib.h>
#include <vector>
#include<iostream>
#include <fstream>
#include <boost/progress.hpp>
using namespace std;
using namespace boost;

int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> v(100,"aaa");
    v[10]="";
    v[23]="";

    ofstream fs("./test.txt");//打开一个文件输出流,记得包含fstrean头文件
    progress_display pd(v.size());//实例化一个显示类的基数(即进度条里最多的个数作为分母)
    for(vector<string>::iterator& x=v.begin();x!=v.end();x++)
    {
        fs<<*x<<endl;//想test写入文件
        ++pd;//更新进度条
        if(x->empty())
        {
            cout<<"null string #"<<(x-v.begin());
            pd.restart(v.size());//将pd重新设置到开始
            pd+=(x-v.begin()+1);//同时再将进度显示到我们需要显示的那
        }
    }
    return 0;
}

结果:

时间: 2024-10-25 20:01:01

boost学习2.4:progress_diplay的相关文章

boost 学习

智能指针的学习 中文教程网站 http://zh.highscore.de/cpp/boost/ 不过代码可能 由于BOOST 版本不同需要稍作修改 scoped_ptr 离开作用域则自动调用类析构函数或者函数delete方法 shared_ptr 使用率最高的指针 类似scoped_ptr 但是所有权可以转移 #include <iostream> #include <vector> #include <windows.h> #include <boost/sm

Boost学习总结(一)VS2010环境下编译STLport和Boost

Boost简介 Boost库是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库.1998年,Beman G.Dawes(C++标准委员会成员之一)发起倡议并建立了Boost社区,目的是向C++程序员提供免费的.同行审查.可移植的高质量C++源程序库.Boost涵盖了字符串与文本处理.容器.迭代器.算法.图像处理.模板元编程.并发编程等等,使用Boost,将大大增强了C++的功能和表现力. STLport是什么? STLport是一个完全符合C++98标准的一个免费的C++标准库实现

boost学习 内嵌类型 与 any 的代码联系

本文是学习 boost源码的一些练习 参考文章来自 刘未鹏 C++的罗浮宫(http://blog.csdn.net/pongba) 目录 http://blog.csdn.net/pongba/article/category/37521 检测内嵌类型 检测一个类中是否存在指定的类型 那么只需要利用模板检测输入参数 根据参数的不同 导入到不同的函数中 类似 template <typename T> void Register(T person) { Register(person, typ

Boost学习笔记(三) progress_timer

progress_timer也是一个计时器,它继承自timer,会在析构时自动输出时间,省去timer手动调用elapsed()的工作,是一个用于自动计时相当方便的小工具. #include <boost\timer.hpp> #include <boost\progress.hpp> #include <iostream> using namespace boost; using namespace std; int main() { boost::progress_

Boost学习笔记(二) 时间与日期

timer库概述 timer库包含三个组件:分别是计时器类timer.progress_timer和进度指示类progress_display timer 主要作用是计时,精确度是毫秒级.下面是一个简单的例子 #include <boost\timer.hpp> #include <iostream> using namespace boost; using namespace std; int main() { timer t; //声明一个计时器,开始计时 cout<&l

C++ Boost 学习资源列表

文档书籍下载 Boost Documentation Boost代码下载       优秀网站导航 Boost官方网站 Boost中文站 Boost Consulting     专题资源报告 Linux伊甸园- STL/boost专区 CSDN-Boost系列专题       个人博客推荐 C++有价值blog索引 <Learning boost>系列文章 C++罗浮宫-C++0x C++罗浮宫-boost源码剖析 roger007专栏-Boost C/C++多平台编程-Boost技术 吴尔

boost学习2.6:data_time库(2,处理日期)

(1)处理年月日,格里高历,位与命名空间boost::gregorian #define BOOST_DATE_TIME_SOURCE #include <boost/date_time/gregorian/gregorian.hpp> using namespace boost::gregorian; (2)创建日期对象 #define BOOST_DATE_TIME_SOURCE #include <boost/date_time/gregorian/gregorian.hpp>

boost学习2.3:progress_timer类(继承自timer)

progress_timer类 (1)是继承自timer,会在析构时自动输出时间(而不用手动调用elapsed函数) (2)progress_timer位于命名空间boost中,还有需要包含文件progress.hpp          #include <boost/progress.hpp>         using namespace boost; (3)progress_timer继承了timer的全部能力.          可以用花括号在一个程序中进行多次计时操作.{...}{.

Boost学习之可移植路径操作--filesystem

Boost.Filesystem 库为对路径.文件和目录进行查询和操作提供了可移植的工具,已经被C++标准委员会接纳包含到TR2中. 编译 使用Boost.Filesystem 库之前要先编译它,请参考<Boost的编译> 头文件 #include <boost/filesystem.hpp> 所有Boost.Filesystem库的内容都处于名空间boost::filesystem之内. 认识basic_path类 在Boost.Filesystem库里basic_path是最重