応用プログラミング 第 4 回 ファイル操作 2017 年 10 月 11 日 ( 水 )
第 6 章 ファイル操作
標準入出力とファイル (P.50) これまでのプログラム 入力 : キーボード 出力 : ディスプレイ Input an integer 1024 1024
標準入出力とファイル (P.50) 今回のプログラム 入力 : ファイル ( の内容 ) 出力 : ファイル Input a file name data.dat output.dat created
リダイレクション (P.50-51) Unix OS の機能のひとつ プログラムの作成はこれまで通り行う プログラムを実行する際に, < や > の記号を用いてファイルの入出力を行う 例 ) 整数をいくつか入力し, 和を算出するプログラム // example.cpp int main(){ int x, sum = 0; while(cin >> x){ sum += x; cout << sum << endl; return 0; 以下の num.dat ファイルに保存されている内容を入力に使いたい // num.dat 10-2 5 92-15
リダイレクション (P.50-51) 実行ファイル名 < データファイル名 ( 入力リダイレクト ) プログラム実行の際, 入力をファイルから読み込む方法 // 実行例 % example < num.dat 90 < < を用いて, cin 入力の際にファイルの内容が入力される. // num.dat 10-2 5 92-15
リダイレクション (P.50-51) 実行ファイル名 > 記録先ファイル名 ( 出力リダイレクト ) プログラム実行の際, 出力をファイルに書き込む方法 // 実行例 % example > sum.txt 10-2 5 92-15 (ctrl+d) < // sum.txt 90
リダイレクション (P.50-51) 実行ファイル名 < データファイル名 > 記録先ファイル名 入出力を共にファイルで行う方法 単純に, 入力リダイレクトと出力リダイレクトの両方を行えばよい // 実行例 % example < num.dat > sum.txt < < // sum.txt 90 // num.dat 10-2 5 92-15
cin, cout, cerr(p.50-51) cin や cout は <iostream> ヘッダファイルをインクルードすることによって初めて使えるようになるオブジェクト オブジェクト名変数型基本的役割 cin istream 標準入力 cout ostream 標準出力 cerr ostream 標準エラー出力 *cerr : プログラムがエラーを通知するための出力変数 標準出力と同様に, 画面 ( コンソール ) に文字を出力するための変数なので, cout と同じように使える. プログラムの内容に応じて, cout と使い分けるとよい ( 例 :cout は標準出力, cerr は入力エラーの際の出力に用いる ) ( 注 : リダイレクトを用いても, cerr は必ず画面に出力される )
パイプ (P.52) 以下の二つのプログラムを考える odd.cpp : 連続で入力された数字の奇数番目のみを出力する sum.cpp : 入力された数字の合計を求めて出力する odd.cppの出力をsum.cppで利用するには? 解決策 1: そもそも1つのプログラムにしてしまう 解決策 2:Unixの機能であるパイプを利用する // 実行例 の左の出力を右の入力に使用 % odd sum Input : 12 23 34 45 56 67 (ctrl+d) odd.cppへの入力 Sum : 102 sum.cpp の出力
パイプ (P.52) リダイレクションとパイプの組合せも可能 // 実行例 % odd < data.dat sum > sum.txt < // sum.txt 102 < // data.dat 12 23 34 45 56 67
指定ファイルからの入力 / 指定ファイルへの出力 (P.53-54) リダイレクションもプログラム内で行いたい <fstream> ヘッダファイルに用意されているファイル入力 出力 に用いる ifstream 型, ofstream 型の変数を用いる. ifstream 型, ofstream 型の変数宣言 ifstream 変数名 ( ファイル名 ) ofstream 変数名 ( ファイル名 ) fstream 変数名 ( ファイル名 ) // ファイルの読込 // ファイルへの出力 // ファイルの入出力
指定ファイルからの入力 / 指定ファイルへの出力 (P.53-54) ifstream 変数名 ( ファイル名 ) // ファイルの読込変数宣言 プログラム冒頭に #include<fstream> と記入することを忘れないこと! // ファイル読込の準備部分 ifstream fin( data.dat ); if(!fin){ cerr << cannot open << endl; return 1; fin を使うと, data.dat からの読込を行うように宣言 fin が正常に宣言されたか (=data.dat がちゃんと存在しているか ) どうかをチェック * この後, cin と同様に fin を使うだけで入力リダイレクトと同じになる
指定ファイルからの入力 / 指定ファイルへの出力 (P.53-54) ofstream 変数名 ( ファイル名 ) // ファイルへの出力変数宣言 プログラム冒頭に #include<fstream> と記入することを忘れないこと! // ファイル出力の準備部分 ofstream fout( result.txt ); if(!fout){ cerr << cannot open << endl; return 1; fout を使うと, result.txt への出力を行うように宣言 fout が正常に宣言されたか (=result.txt がちゃんと存在しているか ) どうかをチェック * この後, cout と同様に fout を使うだけで出力リダイレクトと同じになる
指定ファイルからの入力 / 指定ファイルへの出力 (P.53-54) // 奇数番目のみ出力するプログラム #include<iostream> #include<fstream> // 忘れないこと! using namespace std; int main(){ int x, num = 1; (1) (2) while(fin >> x){ if(num % 2 == 1) fout << x << endl; num++; return 0; // ファイル読込の準備部分 ifstream fin( data.dat ); if(!fin){ cerr << cannot open << endl; return 1; // ファイル出力の準備部分 ofstream fout( result.txt ); if(!fout){ cerr << cannot open << endl; return 1;
ファイル入出力と標準入出力 (P.55) ファイル入出力 (fin, fout) と標準入出力 (cin, cout) は 組み合わせて使うことができる. プログラム例 ファイルから読み込んだ名簿の中から, キーボードから打ち込んだ名前を探す. キーボードから入力したいくつかの数値を足し合わせて txt ファイルに記録する. etc cin, cout, fin, fout などの使い分けを間違えないこと!
#include<iostream> #include<fstream> using namespace std; ファイル入出力と標準入出力 (P.55) int main(){ int x, y; bool flag = false; cout << Input a target integer: ; cin >> y; ifstream fin( data.dat ); while(fin >> x){ if(x == y){ flag = true; break; if(flag) cout << y << exists in the data! ; return 0;
ファイル名の読み込み (P.56) 入出力に用いるファイルの名前をプログラム実行ごとに変更したい ただ, 毎回実行前にプログラムのファイル名の部分だけ書き直すのはとても面倒臭い ファイル名をキーボードからユーザが決定できるようにできる string 型の変数 + c_str() メンバ関数 string 型を用いるので, #include<string> を忘れないようにすること!! string filename; cout << Input a filename --> ; cin >> filename; ifstream fin(filename.c_str()); if(!fin){
ファイル名の読み込み (P.56) 右のようには書けないので注意 ifstream, ofstream は char 型の配列で初期化する必要がある obj.c_str() で string 型変数 obj から char 型配列を取り出せる string filename; cout << Input a filename --> ; cin >> filename; ifstream fin(filename.c_str()); if(!fin){ string filename; cout << Input a filename --> ; cin >> filename; ifstream fin(filename); if(!fin){
複数ファイルからのデータ入力 (P.57) #include<iostream> #include<fstream> #include<string> using namespace std; int main(){ const int sz = 3; string file[sz] = { data1.dat, data2.dat, data3.dat for(int i = 0; i < sz; i++){ ifstream fin(file[i].c_str()); if(!fin){ cerr << cannot open << file[i] <<endl; continue;.. ( 以下, 各ファイルの処理へ )..
練習問題 問題. 1 以上の整数 x を入力すると, 1 から x までの奇数を順に odd.txt に保存し, さらにその数が 3 の倍数ならば, コンソールにも出力するプログラムを作成せよ. ただし, 入力として正整数以外が入力されることはないとしてよい. // 実行例 1 正整数 x を入力 : 9 3 9 // odd.txt 1 3 5 7 9 // 実行例 2 正整数 x を入力 : 2 // odd.txt 1