R61 1,30 初めてのファイル作成と書き込み
考察
(kakunin == 'y' || kakunin == 'Y’)
( 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);
}
}
#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);
}
}