C++でパイプ処理に対応したプログラミング - TK's HP

TK's HP ホーム » スポンサー広告 » プログラム » C++でパイプ処理に対応したプログラミング

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++でパイプ処理に対応したプログラミング

Linuxでファイル読み込みかパイプ処理かを自動的に判別してくれるプログラムって格好良いですよね。C++では情報が少ない様なのでメモを残しておきます。正しい方法かどうかは分かりませんが、これで上手く行きます。


例えばgrepとかだとファイルの中から指定した文字列を含む行を表示してくれます。

$ grep "hoge" test.c

パイプでも同様に

$ ps ax | grep "hoge"

こんな感じで自分のプログラムもできたらいいなと思い、書いてみました。

例としてその行の最初の文字が'#'である行は出力しないというプログラムです。

ポイントとしては読み込むのを cin または ifstream で行うのですが、親クラスのistreamを経由して読み込むことで、関数からは入力が何かを気にせずに使用できるようになります。

あと地味にpeek(最初の文字を読むだけでリードポインタは変更しない)が便利だったりします。


コンパイル

$ g++ -o del-hash del-hash.cpp

ファイルから読み込み

$ ./del-hash hoge.txt

パイプから読み込んで適当なファイルに書き込み

$ cat hoge.txt | ./del-hash > hogehoge.txt


del-hash.cpp


//============================================================================
// Name : del-hash.cpp
// Author : TK
// Version :
// Copyright : All rights reserved.
// Description : Hello World in C++, Ansi-style
//============================================================================
//g++ del-hash.cpp -o del-hash


#include
#include
#include
#include
#include
using namespace std;


int del_hash(istream &input)
{
int cnt = 0;
string line;

//文字列の解析
while( getline(input, line) != 0 )
{
stringstream data(line.c_str());
if(data.peek() == '#'){continue;}//1文字目が#はコメントとして扱い出力しない

//データの出力
cout << data.str() << endl;
cnt++;
}
return cnt;
}

int main(int aArgc, char **aArgv)
{
string inFileName;

//オプション解析
int opt;
while((opt = getopt(aArgc, aArgv, "i:l:h")) != -1)
{
switch(opt)
{
case 'i' : {inFileName = optarg;}break;
case 'h' :
{
cout << aArgv[0] << " : help" << endl
<< aArgv[0] << " inFile" << endl
<< "\t-i INFILE : set input file to INFILE" << endl
<< "\t-h : help" << endl
<< endl;
return 0;
}break;
default : {}break;
}
}
//オプションが無かったときの処理
for(int i = optind; i < aArgc; i++)
{
if(inFileName.empty()){ inFileName = aArgv[i]; }
else {cerr << "WARNING: '" << aArgv << "'is NOT option of this program." << endl;}break;
}
//入力ファイルが存在するとき
ifstream inFile;
if(!inFileName.empty())
{
//インプットファイルのオープン
inFile.open(inFileName.c_str());
if(!inFile.is_open()){cerr << "ERROR : cannot open file '" << inFileName << "'." << endl; return 0;}
}

//実行
del_hash(( !inFileName.empty() ? inFile : cin));

return 0;
}


関連記事
コメント
非公開コメント

トラックバック

http://tclip.blog.fc2.com/tb.php/55-802e3121

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。