• 検索結果がありません。

プログラミング演習 土曜日(Q組)

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング演習 土曜日(Q組)"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング演習

土曜日(Q組)

主なテーマ

標準入出力とファイル処理(8章)

(2)

8.1 標準入出力(C++)

• ストリームの概念

– C++では、データの入出力を「ストリーム」という概念で操作する – ストリームはデータを入出力処理し、また、入出力に伴う 「状態」を設定/保持する 例:現在、ファイルの何文字目を読み書きしているか、などの情報 物理デバイス 論理デバイス プログラム

cin

cout

入力ストリーム 出力ストリーム

(3)

書式の状態

• C++でデータを出力するとき、何も指定しないとデフォ

ルトルールによって、無難な形で表示される

• 特別な形式で出力したい場合(例:整数を16進数で表

示したい)、書式フラグを指定し、データを書式化する

• 書式フラグは、

「 マニピュレータ(標準演算子)」

として、

利用する

6

(4)

マニピュレータ(p.63の表8.3)

• 基本操作

– 基本的な書式制御をするもの

– 数値に関する書式制御をするもの

– 入出力に関する書式制御をするもの

• 分類

– 引数を必要とするもの

• #include <iomanip> を宣言する必要がある

– 引数を必要としないもの

(5)

マニピュレータ 説明 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> を宣言する必要がある

(6)

ソースコード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をインクルード

(7)

ストリームの状態

• ストリームは現在の自身の状態を表現するエラー状態

値をもっている

• エラー状態は、メンバ関数で知ることができる

• 利用例

if (cin.fail()) ~ 10 メンバ関数 説明

eof() ストリームがEOF(end of file) を検出したらtrue

fail() I/O 操作が失敗したらtrue

bad() ストリームが破損したらtrue

good() ストリームが良好ならtrue

(8)

8.2 ファイル入出力(C++)

• ファイルとの入出力を行うときは、

ファイルストリーム

を用いる

• #include <fstream>

を宣言する

• 必要に応じて3つのファイルストリームオブジェクトを宣言する

– ifstream fin; – ofstream fout; – fstream fboth; プログラム ofstream 出力

ファイル

ifstream 入力 fstream 入出力

(9)

ソースコード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行目の処理を確認しなさい。

(10)

モードの設定

• ファイルを開く際には,第二引数にモードを指定する

• モードはファイル毎の値であり,ファイルを開くたびにセット

する

• 利用例

std :: ofstream outfile;

outfile2.open (“filename”, ofstream:: out | ofstream :: app);

モード 説明 in 入力用に開く out 出力用に開く app 書き出しのたびにファイルの終りまで進んで書き出す ate 開くときにファイルの終りまで進む trunc 開くときに既存のファイル内容を破棄する binary バイナリモードで開く

(11)

ソースコード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つ準備し、画面に出力すると ともに、ファイルにも出力するプロ グラムを作成しなさい。

(12)

8.3 string 入出力(C++)

• 文字列の入出力を行うときは、

文字列ストリーム

を用いる

• #include <sstream> を宣言する

• 文字列ストリームを使うときは、次のクラスを用いる

データ (変数) ostringstream 出力 オブジェクト

string

istringstream 入力 stringstream 入出力 クラス名 説明

istringstream string からの入力用,istream の派生クラス ostringstream string への出力用,ostream の派生クラス stringstream string 入出力用,iostream の派生クラス

(13)

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 Engineering

(14)

8.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);

(15)

8.4 標準入出力(C)

• 書式変換を伴わない出力関数

– puts, fputs 関数による標準出力

• 書式変換を伴わない入力関数

– fgets, fgets 関数による標準入力 18 記述例 使用例 puts( 出力文字列); puts("Hello¥n");

fputs( 出力文字列, 出力先ファイル識別子); fputs("Hello¥n", stdout);

記述例 使用例

gets( 文字列変数); char s[100];

gets(s);

(16)

8.5 ファイル入出力(C)

• ファイルをFILE 構造体として取り扱う関数を用いる

• ファイル構造体の型は<stdio.h>内で宣言されている

• ファイルポインタの定義例

FILE fp ;

• 操作手順

1. ファイル処理のオープン

2. ファイルの読み書き

3. ファイル処理のクローズ

(17)

ファイル処理のオープン

ファイル処理のクローズ

ファイルの読み書き

関数の型定義 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);

(18)

ソースコード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

(19)

ソースコード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

(20)

ソースコード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をインクルード ②ファイルポインタを定義 ③ファイルをオープン ④ファイルにデータを書き込む ⑤ファイルをクローズ

(21)

8.6 文字列入出力

• 文字列を対象として書式指定入出力を行う関数も用意

されている

• 第一引数に文字配列へのポインタを渡すこと以外,

使い方は同じである

24

関数の型定義 int sprintf(char *sp, char *format, ...)

記述例

sprintf(sp, "Hello %d¥n", i);

関数の型定義 int sscanf(char *sp, char *format, ...)

記述例

sscanf(sp, "%d", &i);

(22)

演習問題

• 練習問題8.1~8.7

• 以上は自習も含めてすべて行っておくこと

• 提出:演習問題

1. 入力ファイル名と出力ファイル名を指定し、入力フ

ァイルの内容を出力ファイルにコピーするプログラ

ムを作成しなさい。このとき、入力ファイル名に関し

てエラー処理を加えなさい。

2. 入力ファイルに氏名、年齢、性別を複数人分入力

し、入力ファイルの内容を年齢順に並び変えて出

力ファイルにコピーするプログラムを作成しなさい。

参照

関連したドキュメント

当初は製品に国内向けと海外向けの区別はない。ベ トナムなどで出土する染付日字鳳凰文皿は 1640

噸狂歌の本質に基く視点としては小それが短歌形式をとる韻文であることが第一であるP三十一文字(原則として音節と対応する)を基本としへ内部が五七・五七七という文字(音節)数を持つ定形詩である。そ

原稿は A4 判 (ヨコ約 210mm,タテ約 297mm) の 用紙を用い,プリンターまたはタイプライターによって印 字したものを原則とする.

サンプル 入力列 A、B、C、D のいずれかに指定した値「東京」が含まれている場合、「含む判定」フラグに True を

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

備考 1.「処方」欄には、薬名、分量、用法及び用量を記載すること。

パキロビッドパックを処方入力の上、 F8特殊指示 →「(治)」 の列に 「1:する」 を入力して F9更新 を押下してください。.. 備考欄に「治」と登録されます。

ダウンロードした書類は、 「MSP ゴシック、11ポイント」で記入で きるようになっています。字数制限がある書類は枠を広げず入力してく