現在地 >> メニュー >> TBB >> TBB::pipeline処理

問題


テキストデータを用意し、それを1行読み込んで1行毎にファイルに書き込む操作を
パイプライン処理で記述せよ。

答え

#include <iostream>
#include <string>
#include <fstream>
#include <tbb/task_scheduler_init.h>
#include <tbb/pipeline.h>

const char *filename = "test.txt";

const int Max_token = 2;
/************ 各種データ構造 ***************/

//入力用パイプラインフィルタ
class InputFilter
	: public tbb::filter  //tbb::filterを継承する
{
private:
	std::fstream &file; //参照型
	std::string line;
public:
	//コンストラクタ
	InputFilter(std::fstream &data):file(data),filter(true){}

	//オペレータの設定
	void* operator()(void*) 
	{
		
		std::getline(file,line); //1行読み込み
		
		if(file.eof()) //ファイル末尾かどうか?
		{
			return NULL;  //なければNULL
		}else
		{
			line.append("\n");
			return &line; //次のフィルタへ渡す
		}

	}
};





//出力用パイプラインフィルタ
class OutputFilter
	: public tbb::filter //継承
{
private:
	std::fstream &output_file;
	
public:
	//コンストラクタ
	OutputFilter( std::fstream &data ) : tbb::filter(true), output_file(data) {}
   
	//オペレータの設定
	void* operator()( void* item ) 
	{ 
		std::string &data = *static_cast<std::string *>(item);
		output_file << data.c_str();
		
		return NULL; //終わりなのでNULL
    }
};


//プロトタイプ宣言
void TbbPipelineProcess(std::fstream &fs,std::fstream &fso);



//-------------- メイン関数 ------------------------//
int main(int argc, char *argv[])
{
	
	std::fstream fs(filename,std::ios::in);
	if(fs.fail())
	{
		std::cerr<< "Can't load file\n";
		return -1;
	}

	std::fstream fso("output.txt",std::ios::out);
	if(fso.fail())
	{
		std::cerr<< "Can't Create file\n";
		return -1;
	}


	TbbPipelineProcess(fs,fso); //パイプライン処理へ


	return EXIT_SUCCESS;
}



//-------------Tbbの処理------------------------//
void TbbPipelineProcess(std::fstream &fs,std::fstream &fso)
{

	tbb::task_scheduler_init TbbInit;
	
	tbb::pipeline TbbPipeline; //パイプライン作成
	
	//パイプライン(入力部分)
	InputFilter input_filter( fs );
	TbbPipeline.add_filter( input_filter ); //パイプラインに登録

	//パイプライン(出力部分)
	OutputFilter output_filter( fso );
   TbbPipeline.add_filter( output_filter );//パイプラインに登録

	//トークン数Max_tokenで実行
	TbbPipeline.run(Max_token); 
	TbbPipeline.clear();

	TbbInit.terminate();

}

メモ


パイプライン処理の練習。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます