プログラミング演習
土曜日(Q組)
主なテーマ
標準入出力とファイル処理(8章)
8.1 標準入出力(C++)
• ストリームの概念
– C++では、データの入出力を「ストリーム」という概念で操作する – ストリームはデータを入出力処理し、また、入出力に伴う 「状態」を設定/保持する 例:現在、ファイルの何文字目を読み書きしているか、などの情報 物理デバイス 論理デバイス プログラムcin
cout
入力ストリーム 出力ストリーム書式の状態
• C++でデータを出力するとき、何も指定しないとデフォ
ルトルールによって、無難な形で表示される
• 特別な形式で出力したい場合(例:整数を16進数で表
示したい)、書式フラグを指定し、データを書式化する
• 書式フラグは、
「 マニピュレータ(標準演算子)」
として、
利用する
6マニピュレータ(p.63の表8.3)
• 基本操作
– 基本的な書式制御をするもの
– 数値に関する書式制御をするもの
– 入出力に関する書式制御をするもの
• 分類
– 引数を必要とするもの
• #include <iomanip> を宣言する必要がある– 引数を必要としないもの
マニピュレータ 説明 showbase 基数を表す接頭語を表示する noshowbase 基数を表す接頭語を表示しない showpoint 常に小数点を表示する noshowpoint 小数部があるときだけ小数点を表示する uppercase 16 進数表示や科学的表示に大文字を使う nouppercase 16 進数表示や科学的表示に小文字を使う dec 基数を10 進にする hex 基数を16 進にする oct 基数を8 進にする left 左寄せして右には埋め草する right 右寄せして左には埋め草する fixed 浮動小数点を10 進記法で表示する scientific 浮動小数点を科学的記法で表示する flush バッファをフラッシュする ends ナルを出力し,バッファをフラッシュする endl 改行を出力し,バッファをフラッシュする unitbuf 出力操作毎にバッファをフラッシュする nounitbuf 通常のバッファフラッシュ操作に戻す skipws 入力オペレータで空白類文字を読み飛ばす noskipws 入力オペレータで空白類文字を読み飛ばさない ws 空白類文字を食う 8
表8.3 良く利用されるマニピュレータ
マニピュレータ 説明 setfill(int) 埋め草の文字を指定する setprecision(int) 有効桁数を指定する setw(int) 全体の文字数を指定する setbase(int) 整数表示の基数を指定する 引数を必要とするもの #include <iomanip> を宣言する必要があるソースコード23
#include <iostream> #include <iomanip> int main ( void ) {
std:: cout << std:: hex << std:: setw(8) << std:: setfill (’#’) << 1234 << std:: endl; return 0; } 001 002 003 004 005 006 007 ①iostreamをインクルード ① ストリームを使うためには、ストリームオブジェクトを宣言しなければならない • #include <iostream>を宣言することで下記の標準ストリームを使用可能 • 標準ストリーム • istream cin; 標準入力(通常はキーボード) • istream cout; 標準出力(通常はディスプレイ) • istream cerr; 標準エラー出力(バッファリングなし) • istream clog; 標準エラー出力(バッファリングあり) ③出力演算子(<<)を用いる ④改行 ②iomanipをインクルード
ストリームの状態
• ストリームは現在の自身の状態を表現するエラー状態
値をもっている
• エラー状態は、メンバ関数で知ることができる
• 利用例
if (cin.fail()) ~ 10 メンバ関数 説明eof() ストリームがEOF(end of file) を検出したらtrue
fail() I/O 操作が失敗したらtrue
bad() ストリームが破損したらtrue
good() ストリームが良好ならtrue
8.2 ファイル入出力(C++)
• ファイルとの入出力を行うときは、
ファイルストリーム
を用いる
• #include <fstream>
を宣言する
• 必要に応じて3つのファイルストリームオブジェクトを宣言する
– ifstream fin; – ofstream fout; – fstream fboth; プログラム ofstream 出力ファイル
ifstream 入力 fstream 入出力ソースコード24
#include <fstream> #include <string> int main (void) {
std :: ifstream infile; std :: ofstream outfile; infile.open(”file1”); outfile.open(”file2”); std :: string s; while( getline(infile,s)){ outfile << s << std :: endl; } infile.close( ); outfile.close( ); return 0; } 12 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 ①fstreamをインクルード ③出力ストリームを宣言 ②入力ストリームを宣言 ④入力ストリームをオープン ⑤出力ストリームをオープン ⑦入力ストリームをクローズ ⑧出力ストリームをクローズ ⑥入力ストリームから文字列を 入力してstring型のsに格納 課題:ソースコード24を実行して、 11行目の処理を確認しなさい。
モードの設定
• ファイルを開く際には,第二引数にモードを指定する
• モードはファイル毎の値であり,ファイルを開くたびにセット
する
• 利用例
std :: ofstream outfile;outfile2.open (“filename”, ofstream:: out | ofstream :: app);
モード 説明 in 入力用に開く out 出力用に開く app 書き出しのたびにファイルの終りまで進んで書き出す ate 開くときにファイルの終りまで進む trunc 開くときに既存のファイル内容を破棄する binary バイナリモードで開く
ソースコード25
#include <fstream> int main (void){
std :: ifstream file; file.open(”file1”); // file1について,ある処理を行う file.close( ); file.clear( ); file.open(”file2”); //file2について,別の処理を行う file.close( ); return 0; } 14 001 002 003 004 005 006 007 008 009 010 011 012 ①fstreamをインクルード ②ストリームの状態をクリア 課題:内容の異なるテキストファイ ルを2つ準備し、画面に出力すると ともに、ファイルにも出力するプロ グラムを作成しなさい。
8.3 string 入出力(C++)
• 文字列の入出力を行うときは、
文字列ストリーム
を用いる
• #include <sstream> を宣言する
• 文字列ストリームを使うときは、次のクラスを用いる
データ (変数) ostringstream 出力 オブジェクトstring
istringstream 入力 stringstream 入出力 クラス名 説明istringstream string からの入力用,istream の派生クラス ostringstream string への出力用,ostream の派生クラス stringstream string 入出力用,iostream の派生クラス
8.4 標準入出力(C)
• printf 関数による書式変換標準出力
– 記述例:printf( 書式文字列, 変換対象引数... ); – 書式文字列 % フラグ フィールド幅 精度 長さ修飾子 変換指定子 16 使用例 出力結果 printf("%d %f %c", 2*10, 10.0/5.0, '1'); 20 2.000000 1 printf("%+5.2f", 10.0/5.0); +2.00 printf("%a", 1.0/10); 0x1.999999999999ap-4 printf("System %s Engineering", "Design"); System Design Engineering8.4 標準入出力(C)
• scanf 関数による書式変換標準入力
– 記述例:scanf( 書式文字列, 変換対象引数... ); – 注意事項 • 引数には変数へのポインタを与える • 浮動小数点の基本型はfloat 型である 入力文字列 使用例20 2.000000 1 scanf("%d %f %c", &i, &f, &c); +2.00 scanf("%+5.2lf", &d);
0x1.999999999999ap-4 scanf("%la", &d);
8.4 標準入出力(C)
• 書式変換を伴わない出力関数
– puts, fputs 関数による標準出力
• 書式変換を伴わない入力関数
– fgets, fgets 関数による標準入力 18 記述例 使用例 puts( 出力文字列); puts("Hello¥n");fputs( 出力文字列, 出力先ファイル識別子); fputs("Hello¥n", stdout);
記述例 使用例
gets( 文字列変数); char s[100];
gets(s);
8.5 ファイル入出力(C)
• ファイルをFILE 構造体として取り扱う関数を用いる
• ファイル構造体の型は<stdio.h>内で宣言されている
• ファイルポインタの定義例
FILE fp ;
• 操作手順
1. ファイル処理のオープン
2. ファイルの読み書き
3. ファイル処理のクローズ
ファイル処理のオープン
ファイル処理のクローズ
ファイルの読み書き
関数の型定義 FILE *fopen(char *filename, char *mode)
モード w:新規作成,a:新規追加,r:データ読み出し r+, w+, a+ : ランダムアクセス rb, wb, ab: バイナリアクセス 記述例 fp=fopen(“data.txt”,”r”); 関数の型定義 int fclose(FILE *fp) 記述例 i = fclose(fp);
関数の型定義 int fprintf(FILE *fp,char *format, . . . )
記述例 fprintf(fp,”Hello %d¥n”,i);
関数の型定義 int fscanf(FILE *fp,char *format, . . . ) 記述例 fscanf(fp,”%d”,&i);
ソースコード26
#include <stdio.h> int main(void) { int age; float height; char name[40]; FILE *fp; if ((fp = fopen("personal.txt","w")) == NULL){ fprintf(stderr,“File open failed.¥n");return 1; }
while(1){
printf(“Input age height name:¥n");
if (scanf("%d %f %s",&age,&height,name)<3) break; fprintf(fp,"%d %f %s¥n",age,height,name); } fclose(fp); return (0); } 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019
ソースコード26
#include <stdio.h> int main(void) { int age; float height; char name[40]; FILE *fp; if ((fp = fopen("personal.txt","w")) == NULL){ fprintf(stderr,“File open failed.¥n");return 1; }
while(1){
printf(“Input age height name:¥n");
if (scanf("%d %f %s",&age,&height,name)<3) break; fprintf(fp,"%d %f %s¥n",age,height,name); } fclose(fp); return (0); } 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019
ソースコード26
#include <stdio.h> int main(void) { int age; float height; char name[40]; FILE *fp; if ((fp = fopen("personal.txt","w")) == NULL){ fprintf(stderr,“File open failed.¥n");return 1; }
while(1){
printf(“Input age height name:¥n");
if (scanf("%d %f %s",&age,&height,name)<3) break; fprintf(fp,"%d %f %s¥n",age,height,name); } fclose(fp); return (0); } 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 ①stdio.hをインクルード ②ファイルポインタを定義 ③ファイルをオープン ④ファイルにデータを書き込む ⑤ファイルをクローズ