C++のストリーム・ファイル入出力 streamとfstream

#include <iostream>

using namespace std;

int main( )
{
  cout << "abc" << endl;

  return 0;
}

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( )メンバ関数を使うより,オブジェクト指向的にスマートだ。


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


これらの,オプションの指定するためのものはios_baseクラスに入っています。
#include <ios> で使えます。(※明確にincludeしなくてもストリーム系のヘッダファイルはどれも#include <ios>しているので,書かなくても問題ありません)

ios_base::なんとか で使う

ifstream ifs("でーた.dat", ios_base::binary | ios_base::in);
でifsでバイナリモードでオープン。 メンバ関数openでも,同様

ofstream ofs("でーた.dat", ios_base::binary | ios_base::out | ios_base::trunc );
でofsバイナリモードで新規作成書き出し。 メンバ関数openでも,同様

ofstream afs("追記でーた.dat", ios_base::out | ios_base::app );
でofsでファイルがあれば,追記書き込み。無ければ作成

詳細;
ios_base::in : 読み込みモード
ios_base::out : 書き出しモード
ios_base::trunc : 新規作成する(ファイルがあれば,先に消去する)
ios_base::app : 各挿入前にストリームの終端へ移動(追加書き込み)
ios_base::binary : バイナリモードで開く

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 114

なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
驚いた 驚いた 驚いた 驚いた 驚いた 驚いた 驚いた 驚いた 驚いた
面白い 面白い 面白い 面白い
ナイス ナイス ナイス ナイス ナイス ナイス ナイス ナイス
ガッツ(がんばれ!) ガッツ(がんばれ!) ガッツ(がんばれ!) ガッツ(がんばれ!)
かわいい かわいい かわいい かわいい かわいい かわいい かわいい

この記事へのコメント

ScottHeX
2017年01月04日 01:46
Hi there, i read your phorum occasionally and i own a similar one and i was just wondering if you get a lot of spam feedback? If so how do you reduce it, any plugin or anything you can advise? I get so much lately it’s driving me crazy so any support is very much appreciated. http://www.wmmi.org/Redirect.aspx?destination=http://bunga-bunga-party.com
2017年01月13日 04:35
Хочешь встретиться сегодня для секса? Зайди к нам и подбери себе партнера на ночь!
Множество анкет девушек и парней из практически любого города земного шара! Такого больше нету ни на 1 сайте!
http://goo.gl/wL8oMH
PizdaCloge
2017年05月30日 00:54

��頸燾� �頸��
DniilEdunk
2017年10月03日 03:56
ツ�燾� USA上矢印1

http://kok7.ru/wp-content/uploads/2017/10/8e8cc26b472d60adc73e9ede92a2a4db-520x245.jpg


ナ� 上矢印1 趺�瑯車椅子 ⅳ粢萵下矢印1 鈞糘[]�, 炫跫� 裙� �胛四角数字0下矢印1. メ瑕魵 鈞��� 跖鈿�. ハ魲萵 � 褌 - � 肭 � 淲�, � ク� � ⅸ褊�, ⅸ褊� 髜[]鉅四角数字1�褊! ヘ褫趺�� 四角数字0���� � 鮏竟 粨跿 � �四角数字0� �瑩四角数字4渼� �-四角数字0 �粱裲瑣褄�濵�, 趺瀨�鮱? タ � �褊� � 跖鈿� 髜飼濵 �髜褂萵褪 淲 靏� 跖鈿�, � �鵫 鈔褞竟隆 瑜�褪頸...
Johannaadus
2017年10月13日 23:11
ラ襄�� 蓁� ��瑙リボン四角数字0� samsung
浯 浯リボン� 鶯�

萵�裹
SpbRupam
2017年10月28日 02:53
ネ焏ⅱ�璋韶澵�-[]鈔�裲瑣褄�燾� �ⅱ[]� ム瑙��-マ褪褞碯[]� http://sankt-petersburg.xyz/. マ蓁璢瑯� 髜�褊 竟璋韃� 浯 鶯� sankt-petersburg.xyz
Robertshit
2017年10月29日 01:39
ム瑟隆 �ⅰ�隆 碣褊蒡糺� �髜齏�燾� 四角数字1�襁�� � �頏�!

�頸� ��韭� Samsung Galaxy S8
zaxvatunet16.
2017年11月25日 09:16
マⅱ[]� zaxvatu.net 淲 珞頸 �褞裝 碚� USA�� 瑣� 濵粽燾� 黑, �瑣褞鞨�� 浯 鶯� � � 裙� ⅳ蒟��燾� �瑣裙ⅱ�� ��韭ザ・マーク� �褞韶蒻�, 淲 鈞ⅲ割マーク�� 粹韲瑙� 浯 頷 濵粨鈿�, �ⅳ黑�  �鮻濵 ⅶ瑩瑕四角数字1鉋籵下矢印1 �瑕 - �褞韶蒻��.
マⅱ[]� 鈞瑣�.淲� []釿頸 浯 �瑣裙ⅱ韋, 聿� []銕襌�ザ・マーク� 瑣�� �鮏�チューリップ� �� 靏�� ⅳ濵四角数字1��濵 浯鈔瑙韜 �頷 �瑣裙ⅱ韜.
ハ瑣裙ⅱ� ォヘ裝粨跖�ⅲ下矢印1サ 浯�鸙�褪� 濵粽��� � 瑣��� � 淲葢韆韲ⅲ四角数字4 ミⅲ�, ムリタ � 糂裙� ⅲ[]��濵胛 �頏�. マ鮏�瑣裙ⅱ� ォト黑サ 蒟頸 糂ク 四角数字0, � �鮻褪 ⅳ濵下矢印1� � �四角数字0�� ���四角数字4�, 竟四角数字1[]褞� 蒡�魵 � �濵胛� 蓿鮱. ツ �鮏�瑣裙ⅱ韋 ォチ韈淲自転車 蒡矜粱��ザ・マーク� 瑣�� � 髜鉋 浯瀨魵魲� 夜/流れ星[]�四角数字1[] � 糂�, � �瑰瑯ザ・マーク� 礪鈿褥� � 蒟淲�. マ鮏[]鈕褄� ォム割マーク鵫�狃 ⅳ粢蒟浯 �� �ⅰ鸙�下矢印1� �瑣褞鞨�瑟�, ⅳ濵�チューリップ�頌� �瑕-�鞦� � 頸褄�糒 � 韈�褊褊� � �四角数字0� 褞�.
2018年05月08日 00:59
Thanks for finally talking about >C++_Xg_[Et@C_o streamfstream __[b{{__/EFu_u_O

この記事へのトラックバック