ファイル入出力2

課題6

課題6から8までは、存在しないファイル"file100.txt"をオープンさせようとし た際の、エラーの表示の違いを調べる課題である。 下記のプログラムをfile6.cとして書き、実行方法の通りリダイレクトで結果を 出力し、出力結果を確認せよ。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  FILE *fin;

  printf("実行中\n");

  if((fin=fopen("file100.txt", "r")) == NULL){
    printf("入力ファイルをオープンできません。\n");
    exit(1);
  }

  fclose(fin);

  exit(0);
}
(実行方法)
hp3225[susaki]502:~/program% ./a.out > file6.txt
(実行結果の確認)
hp3225[susaki]503:~/program% cat file6.txt 

(注意) "file6.rst"が存在する状態で上記のコマンドを実行すると

file6.rstと言うファイルはすでに存在します.

というメッセージが表示されて、実行は失敗に終わる。その場合には、

上書きする方法1:

% ./a.out >! file6.txt

として実行すること。この場合は、"file6.rst"は上書きされることになる。 そもそも上書き禁止の設定は、ホームディレクトリの.cshrcファイルに

set noclobber

と記述されているためである。したがって、

上書きする方法2:

% unset noclobber <- 上書き禁止の解除
% ./a.out > file6.txt

として実行しても、"file6.txt"は上書きされることになる。 この注意は課題7, 8においても共通である。

課題7

下記のプログラムをfile7.cとして書き、実行方法の通りリダイレクトで結果を 出力し、出力結果を確認せよ。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  FILE *fin;

  printf("実行中\n");

  if((fin=fopen("file100.txt", "r")) == NULL){
    fprintf(stdout, "入力ファイルをオープンできません。\n");
    exit(1);
  }

  fclose(fin);

  exit(0);
}
(実行方法)
hp3225[susaki]504:~/program% ./a.out > file7.txt
(実行結果の確認)
hp3225[susaki]505:~/program% cat file7.txt 

課題8

下記のプログラムをfile8.cとして書き、実行方法の通りリダイレクトで結果を 出力し、出力結果を確認せよ。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  FILE *fin;

  printf("実行中\n");

  if((fin=fopen("file100.txt", "r")) == NULL){
    fprintf(stderr, "入力ファイルをオープンできません。\n");
    exit(1);
  }

  fclose(fin);

  exit(0);
}
(実行方法)
hp3225[susaki]506:~/program% a.out > file8.txt
(実行結果の確認)
hp3225[susaki]507:~/program% cat file8.txt 

課題9

これまで3回のソフトウェア基礎aの試験結果を数人分入力して、それをファイル file9.txtに出力したい。下記のプログラムを file9.cとして書き、 実行結果例のように実行されるか確認せよ。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  FILE *fout;
  int	dat[3], n=1;

  if((fout=fopen("file9.txt", "w")) == NULL){
    printf("出力ファイルをオープンできません。\n");
    exit(1);
  }

  printf("これまで3回のソフトウェア基礎aの試験結果を入力してください。\n");
  printf("入力例)\n");
  printf("1人目: 50 62 82\n");
  printf("2人目: 78 65 54\n");
  printf("3人目: \n");
  printf("入力の終了時には  Ctl+d  を入力してください。\n");


  while (1) {
    printf("%d人目: ", n);
    if (scanf("%d%d%d", &dat[0], &dat[1], &dat[2]) == EOF) {
      break;
    }
    fprintf(fout,"%d %d %d\n",dat[0], dat[1], dat[2]);
    n++;
  } 

  fclose(fout);

  exit(0);
}
(実行結果例)
hp3221[susaki]501:~/program% ./a.out
これまで3回のソフトウェア基礎aの試験結果を入力してください。
入力例)
1人目: 50 62 82
2人目: 78 65 54
3人目: 
入力の終了時には  Ctl+d  を入力してください。
1人目: 78 82 85
2人目: 65 45 70
3人目: 60 56 89
4人目: hp3221[susaki]502:~/program% 
hp3221[susaki]502:~/program% 
hp3221[susaki]502:~/program% cat file9.txt
78 82 85
65 45 70
60 56 89
hp3221[susaki]503:~/program% 

課題10

課題9で作成したファイルfile9.txtからデータを読み込んで、実行結果の ように、3回の試験の平均点と成績を標準出力に表示させたい。成績の付け方は 構造体1の課題4と 同じである。要求を満たす プログラムをfile10.cとして書き、実行結果例のように実行されるか確認せよ。

(実行結果)
hp3221[susaki]503:~/program% a.out
これまで3回のソフトウェア基礎aの試験結果:
1人目:  78  82  85: 平均点= 81.7 成績=A
2人目:  65  45  70: 平均点= 60.0 成績=C
3人目:  60  56  89: 平均点= 68.3 成績=C
hp3221[susaki]504:~/program% 

課題11

課題10で作成したプログラムfile10.cを、スクリプト言語であるperlを 用いて書き直すと下記の通りとなる。下記のスクリプトを file11.plとし て書き、実行結果のように動作することを確認せよ。C言語による記述との違いを理解 するために、スクリプトをコピーせず、自分で書いて完成させるように。

(スクリプト)
#!/usr/bin/perl

$n = 1;
open (IN, 'file9.txt') or die "$!";

print "これまで3回のソフトウェア基礎aの試験結果:\n";

while(<IN>){

    chomp($_);
    @dat = split / /, $_;

    $ave = ($dat[0]+$dat[1]+$dat[2])/3;

    if($ave >= 90.0){
	$score = 'S';
    } elsif($ave >= 80.0){
	$score = 'A';
    } elsif($ave >= 70.0){
	$score = 'B';
    } elsif($ave >= 60.0){
	$score = 'C';
    } else{
	$score = 'D';
    }

    printf STDOUT "$n人目: %3d %3d %3d: 平均点=%5.1f 成績=$score\n", $dat[0], $dat[1], $dat[2], $ave;
    $n++;

}
close IN;
exit;

(注意) 実行させる前に、

% chmod +x file11.pl

として、実行可能な状態に設定しておくように。

(実行結果)
hp3221[susaki]505:~/program% ./file11.pl
これまで3回のソフトウェア基礎aの試験結果:
1人目:  78  82  85: 平均点= 81.7 成績=A
2人目:  65  45  70: 平均点= 60.0 成績=C
3人目:  60  56  89: 平均点= 68.3 成績=C
hp3221[susaki]506:~/program% 

須ア純一 京都大学大学院 工学研究科社会基盤工学専攻 空間情報学講座
[C言語 演習問題トップページ] [須ア純一ホームページ]