さとーC++ぶろぐ

アクセスカウンタ

zoom RSS C++ fstreamの使い方

<<   作成日時 : 2007/11/06 21:19   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 19 / トラックバック 0 / コメント 3

C++でファイル入力出力には,fstreamを使う。
ifstreamクラスでファイルから入力
ofstreamクラスでファイルへ出力する

私が実際にifstreamやofstreamを使うときのコードを紹介します。

-----------------------------------
// ファイルから読み出したものを画面に全て出力
#include <fstream>
#include <string>

#include <iostream>

using namespace std;

int main( )
{
  ifstream ifs("data.txt");
  string buf;

  while(ifs && getline(ifs, buf)) {
    cout << buf << endl;
  }

  return 0;
}
------------------------

while(ifs && getline(ifs, buf))
について
ifs を最初につけているのは,ファイルを開くのを失敗したかどうかの点検
getlineは,ifs.getline( ) と同じ機能で,ifsで開いたファイルから1行読み込む
これも,whileの内側に入れておけば,読み込み終了や,読み込み失敗時に
自動的にwhileのループから抜ける。

常に string型で1行読み込めは,文字列の長さが長すぎる場合(char配列のときの配列長が足りない場合)とか,数値読み込み予定で文字列が来たときの対処に強くなる。外部にあるファイルなんて,実際どんな内容が書いてあってもおかしくないので,問題対策にも強い。

具体的には,以下のコードは使わないということだ。

int a;
char b[10];
ifstream ifs("data.txt");

ifs.getline(b, 9); // char型でgetline 9文字以上は,ややこしい。
ifs >> a; // 数値がこないと,読み込まない=>不安定になる。


実際のプログラムで「ファイルを開くことが出来ませんでした」とか
「データの読み込みに失敗しました」等を表示しても,ユーザは
困るだけである。このメッセージで対処出来る人は,そこそこ知識がある人。
また,知識がある人なら,メッセージが出なくても,ある程度推測できる。

そのため,エラーメッセージは出さず,ファイルがないなどのエラーが起こっても
問題ない様に「セーフモード」を用意しておいて動作し続けるコードの方が
現実的である。まぁ,「ファイルがない」か,「ファイルが壊れている」ぐらいは,
知らせたほうが良いかも。


ファイルへの書き出し

-----------------------------------
// ファイルから読み出したものを画面に全て出力
#include <fstream>

using namespace std;

int main( )
{
  ofstream ofs("data.txt");
  string buf;

  if(ofs) {
    ofs << "OK" << endl; // cout に書き出すのと同じ感じで
  }

  return 0;
}
------------------------


ファイルの開いている範囲を限定する



-----------------------------------
// ファイルから読み出したものを画面に全て出力
#include <fstream>

using namespace std;

int main( )
{
  {
    ofstream ofs("data.txt");
    string buf;

    if(ofs) {
      ofs << "OK" << endl; // cout に書き出すのと同じ感じで
    }

  } // ここまでくれば, ofs はofs.close();が自動実行される。


  
  ofstream ofs("data.txt");
  string buf;

  if(ofs) {
    ofs << "OK" << endl; // cout に書き出すのと同じ感じで
  }


  {
    ifstream ifs("data.txt");
    string buf;

    while(ifs && getline(ifs, buf)) {
      cout << buf << endl;
    }
  } // ここまでくれば, ifs はifs.close();が自動実行される。

  return 0;

}
------------------------

ブロック { } を使い,ファイルの開いている範囲を明確に出来るし,
ifs.close( ) ;を書かなくて済む。

また,{ } の外では,絶対に閉じられたファイルへのアクセスが無いので,
ファイルが閉じられてアクセスできなくなっても,絶対に
ファイルの読み書きを実行しないことが,保障される。

また,コンストラクタでopenしデストラクタでcloseするようにしたほうが,
open( )メンバ関数や,close( )メンバ関数を使うより,オブジェクト指向的にスマートだ。


ファイル入出力のオプション
バイナリモードと追加書き込みモード

---まだ編集中--

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 19
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
驚いた 驚いた
かわいい かわいい
面白い
ナイス
ガッツ(がんばれ!)

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(3件)

内 容 ニックネーム/日時
あなたは何者なんですか?
岡村浩嗣
2007/11/27 18:10
課題の役になりました。

外部のファイルを入出力したり操作が出来るなんて今更ながら感動しています、ありがとうございます。
yasukin
2007/12/28 00:34
「ifs を最初につけているのは,ファイルを開くのを失敗したかどうかの点検」
はwhile内で通過時に毎回評価しているように見えるのですがちがうのでしょうか?
もし毎回評価しているようでしたら、最初に一回の評価だけでいいような気もしましたが。。
ぽんちき
2010/09/18 05:21

コメントする help

ニックネーム
URL(任意)
本 文
C++ fstreamの使い方 さとーC++ぶろぐ/BIGLOBEウェブリブログ
文字サイズ:       閉じる