auの日記

プログラミング初心者の日記。(auはハンドルネームです)

以前作成した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", &reg);

    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", &reg);

    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の内容

f:id:program-shoshinsya:20180831174452p:plain
今度はうまく動作することが確認できました。

fp = fopen(filename, "w");

の文を追加し、fprintfの第1引数をfpにしたらうまくいきました。前回fprintfを勉強したことでこれに気づくことができたのでよかったです。