60日間全力プログラミング

プログラミング初心者が二ヶ月間でどこまでいけるかを記録したプログラミング学習ブログ

R61 1,30 初めてのファイル作成と書き込み

考察
 
(kakunin == 'y' || kakunin == 'Y)
( A | | B )  { C ]
AでもBでもない場合、Cを実行する。  ||=論理和  &&=論理積
do while文 do{ 繰り返し命令; } while (条件式);
char *    配列で指定された文字数     %s(文字列を表示)
gets文はメモリをクラッシュさせてしまう危険性があるため使わない。代わりに、fgets文を使う。
 puts("Name?"); 
    fgets(name, 20, stdin); 
Segmentation fault  = バッファオーバーフロー
 
scanfの文ではスペースや改行が使えないため、
scanf("%c%*c", &c); 入力した際の改行文字を%*cで除去することを意味する。
"This is a pen" というものだった場合、実引数に入力されるものは "This" までである。これだけでも問題であるが、さらに問題なのは、残りの " is a pen" という文字列はストリーム上に残されてしまうことである。このため次に scanf を呼んだ場合、入力にかかわらず実引数に "is" という文字列を代入しようとしてしまうことになる。これを防ぐ手段としては
scanf("%[^\n]", a);
という方法がとられる。この場合は改行文字以外の文字列を全て a に代入するため、a には空白やタブも含めて文字列が代入される。
 
 
 
(1)処理概要
   画面より社員番号、氏名、基本給を入力しファイルに出力する。
(2)画面
①初期画面
 
 
      <<< 社員マスタ登録 >>>
 
     新規登録=1、追加登録=2 : n
 
     ↓ ↓     ↓
11 21 42桁
 
②入力画面
 
 
     1 社員番号 (半角数字4桁) : nnnn
     2 氏 名 (全角7文字) : XXXXXXX
     3 基 本 給 (半角数字8桁) : nnnnnnnn
 
登録しますか?(y/n): y
         続けますか?(y/n) : y
 
     ↓ ↓     ↓
11 21 42桁
 
(3)メイン処理
  ①初期画面を表示し出力方法(shurui)を受け取る。 
    1:新規登録...今回1件目から出力する。(ファイルオープンモードを"w")
    2:追加登録...前回の続きから出力する。(ファイルオープンモードを"a")
  ②登録関数を実行する。引数を出力方法とする。「touroku(shurui);」
  ③2件目以降の出力の出力方法は2とする。(shurui = 2;)
  ④処理を続けるかのどうかの表示をし、確認(kakunin)に結果を受け取る。
  ⑤確認が'y'または'Y'のときは①から③を繰り返す。
 
 
(4)登録処理「void touroku(int shurui)」
  ①入力画面を表示し、社員番号(bango)、氏名(namae)、基本給(kihonkyu)を入力する。
②登録確認(kakunin)を受け取る。
  ③登録確認が 'y'か'Y'のとき
   ・出力方法(shurui)が1ならファイル"shain_m.txt"を"w"モードで、
                  「fp=fopen("shain_m.txt","w");」
             2ならファイル"shain_m.txt"を"a"モードでひらく。
                 「fp=fopen("shain_m.txt","a");」
   ・社員番号(前ゼロ付き4桁)、氏名(左寄せ15桁)、基本給(前ゼロ付き8桁)をファイルに
    出力する。fprintfを使用する。
         「fprintf(fp, "%04d   %-15s    %08d\n",bango,namae,kihonkyu);」
              ↓  ↓    ↓     ↓
           ファイルポインタ 前ゼロ4桁 左寄せ15桁 前ゼロ8桁
   ・ファイルをクローズする。
 (注)上記の例ではファイルポインタを次のように宣言した場合である。
FILE *fp;
 
 
#include
#include


void touroku(int);

int main()
{
   
   
int shurui;
   
char kakunin;
   
    printf(
"\n<<< 社員マスタ登録 >>>\n\n");
    printf(
"      新規登録=1、新規登録=2 : ");
    scanf(
"%d%*c", &shurui);
   
   
do
    {
        touroku(shurui);
        printf(
"              続けますか?   (y/n): ");
        scanf(
"%c%*c", &kakunin);
        shurui =
2;
    }
while (kakunin == 'y' || kakunin == 'Y');
       
return 0;
}

void touroku(int shurui)
{
   
int bango;
   
char namae[20];
   
int kihonkyu;
   
char kakunin;
    FILE *fp;
   
    printf(
"\n      1 社員番号(半角数字4桁) :");
    scanf(
"%d%*c", &bango);
    printf(
"       2 氏名(全角10文字) :");
    scanf(
"%[^\n]%*c", namae);
    printf(
"       3 基本給(半角数字8桁) :");
    scanf(
"%d%*c", &kihonkyu);
   
    printf(
"\n      登録しますか? (y/n): ");
    scanf(
"%c%*c", &kakunin);
   
   
if (kakunin == 'y' || kakunin == 'Y')
    {
       
if (shurui == 1)
        {
            fp = fopen(
"shain_m.txt","w");
        }
       
else
        {
            fp = fopen(
"shain_m.txt","a");
        }
        fprintf(fp,
"%04d %-15s %08d\n", bango, namae, kihonkyu);
        fclose(fp);
    }
}