Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++のifstreamの使い方)

C++のifstreamの使い方とは?

このQ&Aのポイント
  • C++のifstreamを使ってファイルを読み込む方法について解説します。
  • ifstreamを使用してファイルを読み込む際、ファイルの中身が空だとどのような例外処理が行われるのか疑問に思っています。
  • コードの一部を変更することで、ファイルの中身が存在する場合に正しく動作するようになりますが、その違いについて詳しく教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ifstream inStream(str); の行が、何をやっているか、理解してますか? 「strで指定されたファイルをストリームとしてオープンして、ファイルの読み込みポインタを先頭にする」のですよ。 そして return inStream; の行で、オープンしたストリームを「ifstream型の変数」として返しています。 なので while (inStream(argv[1]) >> input) とやると「毎回、argv[1]で指定されたファイルをオープンして、読み込み位置を1行目にする」ってのを繰り返します。 なので「何回ループしようが、1行目しか返って来ない」のです。 しかも、ストリームをクローズしないまま、何度も再オープンを繰り返しているので、何十回か繰り返した段階で、リソースを使い尽くしてオープンエラーが出る筈です。 ともかく「クローズしないでオープンを何度も繰り返す」ってのは、絶対に駄目です。 オープンしたストリームハンドラは「プログラム終了時に自動的にクローズされる」ので、明示的にクローズしない人が殆どですが、本来であれば「ストリームハンドラを変数に受け取って、最後にクローズするべき」なのです。 #include <iostream> #include <string> #include <fstream> using namespace std; ifstream inStream(char *str); int main(int argc, char *argv[]) { if (argc < 2) cout << "ファイル名を指定してください" << endl; else { try { string input; //オープンしていいのは最初の1回だけ! //ストリームハンドラは変数に受け取る ifstream instream = inStream(argv[1]); //受け取った変数でループを回す while (instream >> input) cout << input << endl; } //終わったらちゃんとクローズ! instream.close(); //ここから例外処理 catch (int i) { cerr << argv[1] << "を開けません" << endl; } } return 0; } ifstream inStream(char *str) { ifstream inStream(str); if (!inStream) throw 1; return inStream; }

tmiyoshi
質問者

お礼

詳しい説明ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>ifstream instream = inStream(argv[1]); >while (instream >> input) >にするとうまくいくようなのですが、この違いがよくわかりません。 >違いを教えてください。 inStream()の中で「毎回、新規にオープンし直す」ので、結果として「毎回先頭から読み込んでいる」んです。 # 正確には…ローカル変数としてifstreamのインスタンス作成して…でしょうかね。 コードに書かれた通り、正常動作していますよ。 # ただし、オープンしたifstreamを閉じていないので、リソースリークしていると思いますが。 ってか… >ifstream inStream(char *str) { >ifstream inStream(str); だと、再帰で永遠に自分呼び出ししません?(吹っ飛ぶまで) # いや、ローカル変数名と関数名が同一だからコンパイルエラー?

すると、全ての回答が全文表示されます。

関連するQ&A