6

私はMicrosoftVisualC ++で書いていますが、プログラムで標準の入力またはを使用してファイルから読み取るようにしたいと思いますistream_iterator。インターネットをグーグルで検索しても、それがいかに簡単であるかはわかりません。したがって、たとえば、これを非常に簡単に記述して、標準の入力から読み取ることができます。

#include <iostream>
#include <string>
#include <iterator>

using namespace std;

int main()
{
   istream_iterator<string> my_it(cin);
   for (; my_it != istream_iterator<string>(); my_it++)
      printf("%s\n", (*my_it).c_str());
}

または、これを書き込んでファイルから読み取ることもできます。

#include <iostream>
#include <string>
#include <iterator>
#include <fstream>

using namespace std;

int main(int argc, char** argv)
{
   ifstream file(argv[1]);
   istream_iterator<string> my_it(file);
   for (; my_it != istream_iterator<string>(); my_it++)
      printf("%s\n", (*my_it).c_str());
}

しかし、これら2つを組み合わせて、簡単な(argc == 2)チェックで入力ストリームイテレータをファイルストリームまたはstdinのいずれかで初期化し、楽しい方法で続行できるようにするにはどうすればよいですか?

4

4 に答える 4

14

イテレータを作成した後、イテレータに割り当てることができます。

int main(int argc, char** argv)
{
   ifstream file;
   istream_iterator<string> my_it;

   if(argc == 2) {
      file.open(argv[1]);
      my_it = istream_iterator<string>(file);
   } else {
      my_it = istream_iterator<string>(cin);
   }
}
于 2009-12-16T02:26:09.527 に答える
1

inputこの小さなスニペットは、ファイルまたはstd::cinのいずれかであるistreamを提供します。

std::ifstream filestream;
if ( use_file )
    filestream.open( ... );
std::istream &input = use_file ? filestream : std::cin;

inputこれで、入力がどのソースから来ているかを気にせずに使用できます。

于 2009-12-16T02:25:01.037 に答える
1

一見すると、最も簡単な解決策は、次の?:ような三項演算子を使用することです。

istream_iterator<string> my_it( (argc == 2) ? ifstream(argv[1]) : cin );

ifstreamただし、ステートメントの最後で破棄される一時オブジェクトを構築するため、これは完全には機能しません。したがって、条件付きでを作成し、ループifstream後に条件付きで破棄する方法が必要です。法案に適合します。したがって:forstd::auto_ptr<>

auto_ptr<ifstream> file((argc == 2) ? new ifstream(argv[1]) : NULL);
istream_iterator<string> my_it( (argc == 2) : *file : cin);
for (; my_it != istream_iterator<string>(); my_it++)
   printf("%s\n", (*my_it).c_str());

別の、おそらくよりクリーンな解決策は、反復を.を取る別の関数に移動することistream&です。

私はオンラインの前にこの問題を見たことがあり、C++の偉人の1人によってカバーされています。残念ながら、どこで、誰が行ったのか正確には覚えていません。私はそれがDDJ、多分サッターまたはアレクサンドレスクにあったと思いますか?

于 2009-12-16T02:29:05.340 に答える
0

このような意味ですか:(ポインタを使用して)

#include <iostream>
#include <string>
#include <iterator>
#include <fstream>

using namespace std;

int main(int argc, char** argv)
{
   istream_iterator<string>* my_it = NULL;
   if (argc == 2)
   {
       ifstream file(argv[1]);
       my_it = new istream_iterator<string>(file);
   }
   else
   {
       my_it = new istream_iterator<string>(cin);
   }

   ...

   delete my_it;
}

ただし、これはテストしていません。それはあなたが求めているものですか?

于 2009-12-16T02:25:15.653 に答える