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

ファイル入出力

N/A
N/A
Protected

Academic year: 2021

シェア "ファイル入出力"

Copied!
21
0
0

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

全文

(1)

CプログラミングⅡ

(2)

ファイル入出力

ファイル入出力とは

ファイルへデータを書き込んだり(出力),ファイルから

データを読み込んだり(入力)する

C言語では、キーボードからの入力、画面への出力と

同じようなコードで、ファイル入出力処理を実現できる

プログラム

ファイル

出力

入力

出力

入力

(3)

入出力の基本

ストリーム

プログラム上で様々な装置への入出力を行う機構

様々な入出力装置を統一的な方法で扱うことができる

ハードディスクなどでは ファイルデータによって 入出力が行われる

ファイル入出力におけるストリームの概念

ファイル

ファイル

更新

ストリーム

プログラム

読み込み 書き込み fopen fclose

(4)

ファイル入出力の基本

ファイル入出力処理の順序

① ファイルのオープン

入出力に使われるストリーム

とファイルとを結びつける

② ファイルを読み書きする

③ ファイルのクローズ

ストリームとファイルとを

切り離す

int main(void) { FILE *fp; fp = fopen("test1.txt", "w"); if(fp == NULL){ printf("ファイルをオープンできません¥n"); return 1; } else { printf("ファイルをオープン¥n"); } /* ファイルの読み書き */ fclose(fp); printf(“ファイルをクローズ¥n"); return 0; }

(5)

ファイルポインタの宣言

ファイルポインタ

現在,ファイルのどこを読み書きしているのかを指し

示す(管理する)ためのポインタ

ファイルに接続するときには必ず必要

ファイルポインタの宣言

FILE *ポインタ名;

int main(void)

{

FILE *fp;

FILE *fp1, *fp2;

}

複数のファイルを扱いたい場合には

複数のファイルポインタを宣言する

(6)

ファイルのオープン(ファイルへの接続)

ファイルに接続する(ファイルをオープンする)

ファイルポインタ = fopen(

"

ファイル名

"

,

"

オープンモード

"

);

fopen関数の戻り値

ファイルのオープンが何らかの原因で失敗した場合,

[NULL] (ヌル)を返す.

if文を使用してファイルのオープンに成功したか失敗

したかを判断し,失敗したときの処理を書いておくこと

が望ましい

ファイルオープンの方法

(7)

ファイルのオープンモード

下記の表はfopen命令のモードを示したものである.

用途に対応したモードを設定する必要がある.

モード

意 味

詳 細

r

読み込みモード

ファイルを読み込み用で接続する.

ファイルからデータの読み込みが可能.

w

書き込みモード

ファイルを書き込み用で接続する.

ファイルへのデータの書き込みが可能.

a

追記モード

現在,存在するファイルにデータの追記を行う.

(8)

ファイルオープン処理の例

int main(void)

{

FILE *fp;

char filename[21] = "test2.txt";

if((fp = fopen("test1.txt", "w")) == NULL ){

printf("ファイルをオープンできません¥n");

return 1;

}

if((fp = fopen(filename, "r")) == NULL){

printf("ファイルをオープンできません¥n");

return 1;

}

}

ファイル test1.txt を

書き込みモードで

オープン

同時にオープンに

失敗したとき,

プログラム実行を

終了するように

している

文字列 filename[] に

格納されている

ファイル名のファイルを

読み込みモードで

オープン

(9)

ファイルのクローズ(ファイルの切断)

fclose( ファイルポインタ );

ファイルクローズの方法

ファイルを切断する(ファイルをクローズ」する)

int main(void)

{

FILE *fp;

if((fp = fopen("test1.txt", "r")) == NULL ){

printf("ファイルをオープンできません¥n");

return 1;

}

fclose(fp);

}

fopen文で接続したストリームは

関数の終了時(プログラム実行終了時)に

fclose文で必ず切断することが望ましい

(10)

ファイルへの出力

ファイルへの書き込み

ファイルへデータなどを書き込むには,以下の3つの

命令文(ファイル出力関数)がある

実際には,ストリームを介して

ファイルに書き込んでいる

37

文字列

"Fukuoka"

文字列メンバ

"Fukuoka"

値メンバ1 値メンバ2

21.5

15

構造体

fprintf文

fputc文

fputs文

ストリーム

書き込み

(11)

fprintf関数によるファイルへの書式付出力

ファイルへの書式付出力

fprintf( ファイルポインタ, "書式付文字列" ,引数1,引数2,…,引数n);

ファイルへの書式付出力

int main(void) { int a = 10; double b = 3.1415926535; FILE *fp; fp = fopen("test.txt", "w"); fprintf(fp, "a = %d b = %4.2lf¥n", a, b); fclose(fp); }

(12)

fputs関数によるファイルへの文字列出力

文字列のみを出力する(変数の値などは出力できない)

ファイルへの文字列出力

fputs( "文字列",ファイルポインタ );

ファイルへの文字列出力

int main(void) { FILE *fp; fp = fopen("string.txt", "w"); fputs("Hello World¥n", fp); fclose(fp); }

(13)

fputc関数によるファイルへの1文字出力

文字データ(char型データ)1つを出力する

ファイルへの1文字出力

fputc( char型変数, ファイルポインタ );

ファイルへの1文字出力

int main(void) { char ch = 'A'; FILE *fp; fp = fopen("character.txt", "w"); fputc(ch, fp); fputc('¥n', fp); fputc('Z', fp); fputc('¥n', fp); fclose(fp); }

(14)

例)

int main(void)

{

FILE *fp;

int x = 20, y = 5;

fp = fopen("test.txt", "w");

fprintf(fp, "x:%d y:%d¥n", x, y);

fprintf(fp, "和:%d¥n", x + y);

fprintf(fp, "差:%d¥n", x - y);

fprintf(fp, "積:%d¥n", x * y);

fprintf(fp, "商:%d¥n", x / y);

fclose(fp);

return 0;

}

演算結果の書き込み

(15)

ファイルからの入力

ファイルからの読み込み

ファイルからデータなどを読み込むには,以下の3つ

の命令文(ファイル入力関数)がある

実際には,ファイルから

ストリームを介して

データを読み込んでいる

37

文字列

"Fukuoka"

fscanf文

fgetc文

fgets文

ストリーム

読み込み

(16)

fscanf関数によるファイルからの書式付入力

ファイルからの書式付入力

fscanf( ファイルポインタ, "変換指定" ,引数1のアドレス,… );

ファイルからの書式付入力

int main(void) { int a; double b; FILE *fp = fopen("test.txt", "r"); fscanf(fp, "%d %lf", &a, &b);

printf("a = %d b = %4.2¥n", a, b); fclose(fp);

(17)

fgets関数によるファイルからの文字列入力

1行分(改行まで,もしくは最大文字数)の文字列を入力

ファイルからの文字列入力

fgets( 文字列(char型配列), 最大文字数+1, ファイルポインタ );

ファイルへの文字列出力

int main(void) { char str[16]; FILE *fp = fopen("string2.txt", "r"); fgets(str, 15, fp); printf("1行目:%s¥n", str); fgets(str, 15, fp); printf("2行目:%s¥n", str); fclose(fp); return 0; } 14文字分(+NULL文字)しか 入力されない

(18)

fgetc関数によるファイルへの1文字出力

文字データ(char型データ)1つを入力する

ファイルからの1文字入力

文字型変数 = fgetc( ファイルポインタ );

ファイルからの1文字入力

int main(void) { int i; char str[6]; FILE *fp = fopen("character2.txt", "r"); for(i = 0; i < 5; i++) str[i] = fgetc(fp); str[5] = NULL; printf("%s¥n", str); } 1文字ずつ入力して 文字列に格納

(19)

例)ファイル読み込み

test.txt

int main(void) { FILE *fp = fopen("test.txt", "r");; double x, y, z; fscanf(fp, "%lf", &x); fscanf(fp, "%lf", &y); fscanf(fp, "%lf", &z); printf("x:%.2f y:%.2f z:%.2f¥n", x, y, z); fclose(fp); return 0; }

読み込み

実行結果

(20)

ファイルの読み込みとファイル走査

EOF

ファイル入力処理は,ファイル上を走査することにより

読み込んでいる.

通常は左上から右下に向かって走査を行う.

abcdef・・・

・・・abcdef・・・

・・・abcdef

(21)

ファイルの読み込みとファイル走査

ファイルが終了すると

fscanf関数 は [EOF](End Of File) を返す.

fgets関数 は [NULL] を返す.

ファイルに書かれているデータの数がわからない場合,

それぞれの関数の戻り値を利用して入力処理を終了

させる

例1)fscanf文とwhile文の組み合わせ

i = 0; while((fscanf(fp,"%d",&x[i])) != EOF){ i++; }

例2)fgets文とwhile文の組み合わせ

char str[257]; while(fgets(str, 256, fp) != NULL){ printf("%s", str); } printf("¥n");

参照

関連したドキュメント

Lane and Bands Table と同様に、Volume Table と Lane Statistics Table も Excel 形式や CSV

理由:ボイラー MCR範囲内の 定格出力超過出 力は技術評価に て問題なしと確 認 済 み で あ る が、複数の火力

Dual I/O リードコマンドは、SI/SIO0、SO/SIO1 のピン機能が入出力に切り替わり、アドレス入力 とデータ出力の両方を x2

QRされた .ino ファイルを Arduino に‚き1む ことで、 GUI |}した ƒ+どおりに Arduino を/‡((スタンドアローン})させるこ とができます。. 1)

DC・OA 用波形データ  2,560Hz  収録した波形ファイルの 後半 1024 サンプリング . 従来の収録ソフトウェアも DC, OA 算出時は最新の

東京電力エリアの場合は 東京電力パワーグリッド の「Web 申込システム」へ のユーザIDが必要とな