2016-04-07 4 views
0

私はC++で行うべきことがあります。ファイル.txtを読み込み、その中の情報を使用することを想定しています。しかし、私たちの先生は助けになるコードの始まりを私に与えてくれました。私は本当にそれを手に入れません。私はC++の初心者ですので、数時間それを探していましたが、私は答えを見つけられませんでした、ありがとう!このコードは理解できませんか?これは、C++でファイルを読むことに関するものです。

は、ここでは、コードの一部です:

int main(int argc, const char** argv) 
{ 
    std::ifstream* myfile = NULL; 

    if (argc == 2) { 
     file = myfile = new std::ifstream(argv[1]); 
     if (myfile->fail()) 
      std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl; 
    } 
    else 
     std::cerr << "No file name." << std::endl; 

    while (*file) { 
     std::string event; 
     *file >> event; 
     if (!(*file)) break; 

     if (event == "recipe") { 
      std::string namerecipe; 
      *file >> recipe; 

...

スヨン、私はそれを取得しないのですか? *ファイルとは何ですか?ファイル?それはファイル上のポインタですか?なぜそれにラインの作業のような機能はありません?なぜ "while * file"はどうするのですか? ありがとうございます!

+0

あなたはポインタが何であるかを知っていますか? – immibis

+0

私はこのコードが故意に気違いであると思う。 – user4581301

+1

待ちます。教師は 'std :: ifstream'を動的に割り当てますか?私は何かを見逃している、あるいは特別な教授目的がある、あるいは教師がプログラミングにうまくいかない。 –

答えて

1
int main(int argc, const char** argv) 
{ 

入力ファイルストリームにおけるエラー状態をテストするために、典型的な関数のエントリポイントをストリームのブール演算子を使用しています。

std::ifstream* myfile = NULL; 

    if (argc == 2) { 

argv[1]からファイル名を取得するのに十分な引数があることを確認してください。

 file = myfile = new std::ifstream(argv[1]); 

は、動的にファイル入力ストリームを割り当て、argv[1]で指定されたファイルを開くためにそれを使用しようとします。このファイルストリームは、filemyfileという2つのポインタに割り当てられます。私は2つのポインタを持つことにポイントを見ていないことを認めますが、私はまた、ポインタのポイントが最初に表示されません。

 if (myfile->fail()) 

ストリームのfail関数を呼び出します。これは、ストリームに何か問題があるかどうかをテストします。この時点で、ストリームが開かれたかどうかはテストすることだけです。

  std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl; 
    } 
    else 
     std::cerr << "No file name." << std::endl; 

    while (*file) { 

を参照してください。fileファイルオブジェクトを操作するポインタ。これは、ストリームの論理演算子を呼び出す効果を持ちます。これは、!file->fail()を呼び出すのと同じ(C++ 11またはより最近の)または(C++ 11に以前)、この場合には問題ないように、同様の効果を有しますか。 http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

 std::string event; 
     *file >> event; 

読むストリームから1空白で区切られたトークン、単一の単語、:ここでオペレータブール値の詳細。

 if (!(*file)) break; 

オペレータbool再び。障害発生時にループを終了します。

 if (event == "recipe") { 
      std::string namerecipe; 
      *file >> recipe; 

ストリームから別の単語を読み込みます。

コードは、これらの線に沿って書き換えることができます

int main(int argc, const char** argv) 
{ 
    if (argc == 2) 
    { 
     std::ifstream myfile(argv[1]); 
     if (myfile) 
     { 
      std::string event; 
      while (myfile >> event) 
      { 
       //this function is getting deep. Consider spinning this off into a new function 
       if (event == "recipe") 
       { 
        std::string namerecipe; 
        if (myfile >> recipe) 
        { 
         // do stuff that is missing from code sample 
        } 
        else 
        { 
         // handle error 
        } 
       } 
      } 
     } 
     else 
     { 
      std::cerr << "Error at the opening of the file'" << argv[1] << "'" << std::endl; 
     } 
    } 
    else 
    { 
     std::cerr << "No file name." << std::endl; 
    } 
} 
+0

ありがとう、本当にありがとう!私は今得たと思う、あなたの説明は非常に明確である – robbie

0
  1. *fileは、入力ファイルストリームifstreamオブジェクトを指すポインタです。
  2. fileは、あなたの入力ファイルストリームifstreamオブジェクトです。

  3. while(*file)(エラーなしでファイルを読みながら)

+0

ポイント3が間違っています。これはNULLのテストではなく、ストリームのブール演算子を使用してストリームのエラー状態をテストしています。 – user4581301

+0

@ user4581301私はそれがリンクリストをどのように反復するかのように思った。私はそれを編集するレッスンをありがとう。もっと明確にすることはできますか? –

+1

これは 'while(!file-> fail())'の短縮形です。もっとここに:http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool(私は修正する必要があります.C++ 11では略語です。以前はそれだけでした) – user4581301