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 : バイナリモードで開く

この記事へのコメント

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

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