Taro-ファイル処理(公開版).jtd

Similar documents
ファイル入出力

ファイル入出力

計算機プログラミング

gengo1-12

gengo1-12

情報処理演習 B8クラス

Microsoft Word - Cプログラミング演習(9)

gengo1-12

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint - CproNt11.ppt [互換モード]

C言語講座 ~ファイル入出力編~

プログラミング基礎

Microsoft PowerPoint - 第3回目.ppt [互換モード]

2006年10月5日(木)実施

Prog1_12th

PowerPoint Presentation

Microsoft Word - 06

※ ポイント ※

PowerPoint プレゼンテーション

02: 変数と標準入出力

プログラミング演習3 - Cプログラミング -

02: 変数と標準入出力

プログラミング演習3 - Cプログラミング -

演算増幅器

Microsoft Word - Cプログラミング演習(10)

Microsoft PowerPoint - 14th.ppt [互換モード]

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

ポインタ変数

PowerPoint プレゼンテーション

< F2D837C E95CF CF68A4A94C5816A2E6A>

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

Microsoft Word - cpro_m_13.doc

スライド タイトルなし

C言語入門

PowerPoint Presentation

V

slide4.pptx

Microsoft PowerPoint pptx

ポインタ変数

Microsoft Word - no15.docx

PowerPoint プレゼンテーション

Cプログラミング1(再) 第2回

練習&演習問題

memo

memo

Microsoft PowerPoint pptx

データ構造

Microsoft Word - no103.docx

データ構造

Microsoft Word - Cプログラミング演習(12)

ゲームエンジンの構成要素

Taro-リストⅢ(公開版).jtd

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

Microsoft PowerPoint - kougi4.ppt

Microsoft PowerPoint - prog06.ppt

Microsoft PowerPoint - kougi2.ppt

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

ポインタ変数

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

PowerPoint プレゼンテーション

Taro-リストⅠ(公開版).jtd

訋箊æ©�ã…Šã…�ㇰㅩã…�ㅳㇰ - 第13åłž ã…Łã‡¡ã‡¤ã…«å⁄¦ç’ƒ

Microsoft PowerPoint - kougi8.ppt

Microsoft Word - no204.docx

卒 業 研 究 報 告.PDF

Microsoft PowerPoint - kougi9.ppt

超初心者用

Microsoft PowerPoint - prog03.ppt

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

Microsoft PowerPoint - 11.pptx

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

目次

PowerPoint Presentation

memo

slide5.pptx

Microsoft PowerPoint - CproNt02.ppt [互換モード]

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

プログラミングI第6回

Microsoft PowerPoint - kougi11.ppt

プログラミング及び演習 第1回 講義概容・実行制御

02: 変数と標準入出力

Microsoft PowerPoint - prog05.ppt

untitled

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

プログラミング実習I

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

Microsoft PowerPoint - 5Chap15.ppt

02: 変数と標準入出力

第1回 プログラミング演習3 センサーアプリケーション

第2回講義:まとめ

プログラミング実習I

新・明解C言語 実践編

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

02: 変数と標準入出力

Taro-ポインタ変数Ⅰ(公開版).j

kiso2-09.key

Microsoft PowerPoint - kougi7.ppt

Transcription:

ファイル処理 0. 目次 1. はじめに 2. ファイル内容の表示 3. ファイル内容の複写 3. 1 文字単位 3. 2 行単位 4. 書式付き入出力 5. 文字配列への入出力 6. 課題 6. 1 課題 1 ( ファイル圧縮 復元 ) - 1 -

1. はじめに ファイル処理プログラムの形は次のようになる #include <stdio.h> main() { FILE *fp1,*fp2; ファイルポインタの宣言 ファイルはすべて ファイルポインタを用いて指定する fp1 = fopen("infile","r"); ファイル ( infile) を読み取り専用としてオープン ( ファイルアクセスの準備 ) する fp2 = fopen("outfile","w"); ファイル ( outfile) を書き込み専用としてオープンする ファイル処理 } fclose(fp1); ファイルをクローズ ( ファイルアクセスの後始末 ) する fclose(fp2); C では ファイルへの入出力はバイトの列として行われる 関数 fopen 機能ファイルをオープンする 引数第 1 引数はファイル名 第 2 引数はアクセスのモード "r" は読み込むためにオープンすることを意味する "w" は書き出すためにオープンすることを意味する "a" はファイルの最後に追加するためにオープンする "r+" はファイルを更新するためにオープンすることを意味する 結果オープンできたときは ファイルポインタを返す できなかったときは NULLを返す 関数 fclose 機能 ファイルをクローズする 引数 第 1 引数はファイルを指すファイルポインタ 結果 正常にクローズしたときは 0を返す クローズできなかったときは EOFを返す - 2 -

2. ファイル内容の表示 ファイルから 1 バイト単位 ( 1 文字 ) で入力し 画面に表示する 関数 getc 機能 ファイルから 1 バイト読み込む 引数 第 1 引数は入力元ファイルを指すファイルポインタ 結果 読み込んだデータ ( 整数型 ) を返す ファイルの終わりに達したとき EOFを返す 1 /* << f211.c >> */ 4 char ch; 5 char infile[81]; /* 入力データ用配列 */ 6 FILE *fp1; /* ファイルポインタ */ 7 /* 入力ファイルを指定する */ 8 printf("input file: "); scanf("%s",infile); 9 fp1 = fopen(infile,"r"); 10 /* 入力ファイルから 1バイトずつ読み込み 画面に表示する 11 各行の最後は改行コード ( 10 進で 10) がある */ 12 while( (ch = getc(fp1))!= EOF ) { 13 printf("[%c] [%x]\n",ch,ch); 14 } 15 printf("[%d]\n",ch); 16 fclose(fp1); 17 } % cat f211.dat 12 ab % cc f211.c input file: f211.dat [a] [97] [b] [98] [c] [99] [ <-- 改行が実行されている ] [10] [-1] - 3 -

3. ファイル内容の複写 3. 1 文字単位 ファイルから 1 バイト単位 ( 1 文字 ) で入力し 別のファイルに 1 バイト単位で出力する 関数 putc 機能 ファイルに 1 バイトを書き込む 引数 第 1 引数は文字 第 2 引数は出力先ファイルを指すファイルポインタ 結果 エラーを検出したとき EOFを返す 1 /* << f311.c >> */ 4 char ch; 5 char infile[81],outfile[81]; 6 FILE *fp1,*fp2; 7 /* 入力ファイルを指定する */ 8 printf("input file: "); scanf("%s",infile); 9 fp1 = fopen(infile,"r"); 10 /* 出力ファイルを指定する */ 11 printf("output file: "); scanf("%s",outfile); 12 fp2 = fopen(outfile,"w"); 13 /* 入力ファイルから 1ハ イトずつ読み込み 出力ファイルに書き込む */ 14 while( (ch = getc(fp1))!= EOF ) { 15 putc(ch,fp2); 16 } 17 fclose(fp1); 18 fclose(fp2); 19 } % cat f311.dat 0123456789 abcdefg ABCDEFG 茨城大学 % cc f311.c input file: f311.dat output file: f311.rst % cat f311.rst 0123456789 abcdefg ABCDEFG 茨城大学 - 4 -

3. 2 行単位 ファイルから 1 行単位で入力し 別のファイルに 1 行単位で出力する 関数 fgets 機能ファイルから 1 行のデータを読み込む 読み込んだ 1 行の文字列の末尾にナル文字を付ける 引数第 1 引数はデータを格納する場所を指定する charポインタ 第 2 引数は文字列のサイズの上限 第 3 引数は入力元ファイルを指定するファイルポインタ 結果ファイルの終わりに達したとき NULLを返し その他の場合は第 1 引数を返す 関数 fputs 機能 ファイルに 1 行のデータを書き込む 引数 第 1 引数は出力する文字列を指す charポインタ 第 2 引数は出力先ファイルを指定するファイルポインタ 結果 エラーを検出したとき EOFを返す 1 /* << f321.c >> */ 4 FILE *fp1,*fp2; 5 char infile[81],outfile[81],string[256]; 6 /* 入力ファイルの指定 */ 7 printf("input file: "); scanf("%s",infile); 8 fp1 = fopen(infile,"r"); 9 /* 出力ファイルの指定 */ 10 printf("output file: "); scanf("%s",outfile); 11 fp2 = fopen(outfile,"w"); 12 while( fgets(string,256,fp1)!= NULL ) { 13 fputs(string,fp2); 14 } 15 fclose(fp1); 16 fclose(fp2); 17 } % cat f321.dat 0123456789 abcdefg 茨城大学 % cc f321.c input file: f321.dat output file: f321.rst % cat f321.rst 0123456789 abcdefg 茨城大学 - 5 -

4. 書式付き入出力 ファイルから書式にしたがってデータを入力し 別のファイルに書式にしたがってデータを出力する 関数 fscanf 機能 ファイルから書式にしたがってデータを読み込む 第 1 引数としてファイルポインタをとる以外は scanfと同じ 関数 fprintf 機能 ファイルに書式にしたがってデータを書き込む 第 1 引数としてファイルポインタをとる以外は printfと同じ 1 /* << f411.c >> */ 4 FILE *fp1,*fp2; 5 int x; 6 char infile[81],outfile[81]; 7 /* 入力ファイルの指定 */ 8 printf("input file: "); scanf("%s",infile); 9 fp1 = fopen(infile,"r"); 10 /* 出力ファイルの指定 */ 11 printf("output file: "); scanf("%s",outfile); 12 fp2 = fopen(outfile,"w"); 13 while( fscanf(fp1,"%d",&x) == 1 ) { 14 x = -x; 15 fprintf(fp2,"%8d \n",x); 16 } 17 fclose(fp1); 18 fclose(fp2); 19 } % cat f411.dat 12 345 6789 % cc f411.c input file: f411.dat output file: f411.rst % cat f411.rst -12-345 -6789-6 -

5. 文字配列への入出力 文字配列から書式にしたがってデータを入力したり 変数の値を書式にしたがって文字配列に出力することができる 関数 sscanf 機能 文字配列から書式にしたがってデータを読み込む 引数 第 1 引数は文字配列 第 2 引数は書式 ( scanfと同じ ) 第 3 引数は変数アドレスの並び 結果 読み込んだ要素の数 関数 sprintf 機能 変数の値を書式にしたがって文字配列に書き込む 引数 第 1 引数は文字配列 第 2 引数は書式 ( printfと同じ ) 第 3 引数は変数の並び 結果 書き込んだ文字数 1 /* << f511.c >> */ 4 int a1,a2,m,n; 5 char b1[20],b2[20],c[20]; 6 /* サンプルデータ */ 7 a1 = 12345; 8 b1[0] = 'a'; b1[1] = 'b'; b1[2] = 'c'; b1[3] = '\0'; 9 printf("a1 = %d\n",a1); 10 printf("b1 = %s\n",b1); 11 n = sprintf(c,"%d %s",a1,b1); 12 printf("c = %s\n",c); 13 printf("n = %d\n",n); 14 m = sscanf(c,"%d%s",&a2,b2); 15 printf("a2 = %d\n",a2); 16 printf("b2 = %s\n",b2); 17 printf("m = %d\n",m); 18 } % cc f511.c a1 = 12345 b1 = abc c = 12345 abc n = 9 a2 = 12345 b2 = abc m = 2-7 -

6. 課題 6. 1 課題 1 ( ファイル圧縮 復元 ) 簡単な圧縮ルール ( 連続する k(1<=k<=100) 個の空白を 空白と 2 桁の数字 k-1 に変換 ) に基づき ファイルを圧縮する [ 例 ] abc123 def --> abc123 04def 1 /* << f611.c >> */ 2 /* ファイルの圧縮 */ 3 #include <stdio.h> 4 main(int argc, char *argv[]) { 5 int ch,count,i; 6 FILE *fp1,*fp2; 7 printf(" 圧縮開始 \n"); 8 fp1 = fopen(argv[1],"r"); fp2 = fopen(argv[2],"w"); 9 count = 0; /* 連続する空白の個数 */ 10 while( (ch = getc(fp1))!= EOF ) { 11 if( count == 0 ) { 12 if( ) { count++; } else { putc(ch,fp2); } 13 } else { 14 if( ) { 15 count++; 16 } else { 17 if( ) { fprintf(fp2," 0%d",count-1); } 18 if( ) { fprintf(fp2," %2d",count-1); } 19 putc(ch,fp2); count = 0; 20 } 21 } 22 } 23 fclose(fp1); fclose(fp2); printf(" 圧縮終了 \n"); 24 } % cat f611.dat % cc f611.c f611.dat f611.rst 圧縮開始圧縮終了 % cat f611.rst a 00b a 01b a 02b a 03b a 04b - 8 -

圧縮規則 ( 連続する k(1<=k<=100) 個の空白を 空白と 2 桁の数字 k-1 に変換 ) にしたがって圧縮されたファイルを元に復元する [ 例 ] abc123 04def --> abc123 def 1 /* << f621.c >> */ 2 /* ファイルの復元 */ 3 #include <stdio.h> 4 main(int argc, char *argv[]) { 5 int ch, 6 count, /* 連続する空白の個数 */ 7 d1,d2,i; 8 FILE *fp1,*fp2; 9 printf(" 復元開始 \n"); 10 fp1 = fopen(argv[1],"r"); fp2 = fopen(argv[2],"w"); 11 while( (ch = getc(fp1))!= EOF ) { 12 if( ch!= ' ' ) { 13 putc(ch,fp2); 14 } else { 15 d2 = getc(fp1); d2 = d2 - '0'; 16 d1 = getc(fp1); d1 = d1 - '0'; 17 count = 18 for( i=1; i<=count; i++ ) { putc(' ',fp2); } 19 } 20 } 21 fclose(fp1); 22 fclose(fp2); 23 printf(" 復元終了 \n"); 24 } % cat f621.dat a 00b a 01b a 02b a 03b a 04b % cc f621.c f621.dat f621.rst 復元開始復元終了 % cat f621.rst - 9 -