以前作成したstudent.txtに出力するプログラムを修正した
auです。
今回は、以前作成してうまくいかなかったfprintf関数を使用して"student.txt"に文字列を出力するプログラムを修正しました。
program-shoshinsya.hatenablog.com
以前のコード
#include <stdio.h> #include <stdlib.h> void new_reg(void) { int id = 0; char name[256][256]; char filename[] = "student.txt"; int count = 0; FILE *fp; if ((fopen(filename, "w")) == NULL) { fprintf(stderr, "ファイルを開くことができませんでした\n"); return EXIT_FAILURE; } /*printf("学籍番号: "); scanf("%d", &id);*/ printf("氏名: "); scanf("%s", name); count = fprintf(fp, name); if (count < 0) { fprintf(stderr, "ファイルの書き込みに失敗しました\n"); fclose(fp); return EXIT_FAILURE; } /*fprintf(stderr, "%d\n", id);*/ fprintf(stdout, "%sへ%d文字書き込みました\n", filename, count); fclose(fp); return EXIT_SUCCESS; } int main(void) { int reg = 0; printf("新規登録: 1 追加登録: 2\n"); scanf("%d", ®); switch (reg) { case 1: new_reg(); break; case 2: // add_reg(); break; default: printf("1か2で入力してください\n"); } printf("終了します\n"); return 0; } // 実行結果 新規登録: 1 追加登録: 2 1 氏名: au Segmentation fault (core dumped)
今回のコード
#include <stdio.h> #include <stdlib.h> void new_reg(void) { int id = 0; char name[256]; char filename[] = "student.txt"; int count; char count_c[30]; FILE *fp; fp = fopen(filename, "w"); if (fp == NULL) { fprintf(fp, "ファイルを開くことができませんでした\n"); return EXIT_FAILURE; } else { printf("ファイルを開きました\n"); } printf("学籍番号: "); scanf("%d", &id); printf("氏名: "); scanf("%s", name); if (count < 0) { fprintf(fp, "ファイルの書き込みに失敗しました\n"); fclose(fp); return EXIT_FAILURE; } fprintf(fp, "id: %d name: %s\n", id, name); printf("%sへ書き込みました\n", filename); fclose(fp); return EXIT_SUCCESS; } int main(void) { int reg = 0; printf("新規登録: 1 追加登録: 2\n"); scanf("%d", ®); switch (reg) { case 1: new_reg(); break; case 2: // add_reg(); break; default: printf("1か2で入力してください\n"); } printf("終了します\n"); return 0; } // 実行結果 新規登録: 1 追加登録: 2 1 ファイルを開きました 学籍番号: 1 氏名: au student.txtへ書き込みました 終了します // student.txtの内容
今度はうまく動作することが確認できました。
fp = fopen(filename, "w");
の文を追加し、fprintfの第1引数をfpにしたらうまくいきました。前回fprintfを勉強したことでこれに気づくことができたのでよかったです。