auの日記

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

きのう作成したstudent.txtの中身をターミナル上に出力する

auです。
きのう、student.txtの中身に出力するプログラムを作成しました。
program-shoshinsya.hatenablog.com
今回はその中身を出力したいとおもいます。
student.txtの中身

cat student.txt
id: 1 name: au
id: 2 name: Sato

fscanfという関数を利用して中身を受け取り、printfでターミナル上に出力します。

プログラム

#include <stdio.h>
#include <string.h>

int main(void) {
    FILE *fp;
    char f_name[] = "student.txt";
    char str1[16];
    char str2[16];
    char name[16];
    int id = 0;

    fp = fopen(f_name, "r");

    if (fp == NULL) {
        printf("%sを開くことができませんでした\n", f_name);
        return -1;
    }

    while (fscanf(fp, "%s, %d, %s, %s", str1, &id, str2, name) != EOF) {
        printf("%s%d%s%s\n", str1, id, str2, name);
    }

    fclose(fp);

    return 0;
}

// 実行結果
id:0@
10@
name:0@
au0@
id:0@
20@
name:0@
Sato0@

何か思ってたのと違う・・・
空白が改行で読み込まれ、文末それぞれに"0@"とついてしまっています。
str1の範囲を256にし、str1だけを出力すると改行以外うまくいきました。

#include <stdio.h>
#include <string.h>

int main(void) {
    FILE *fp;
    char f_name[] = "student.txt";
    char str1[256];

    fp = fopen(f_name, "r");

    if (fp == NULL) {
        printf("%sを開くことができませんでした\n", f_name);
        return -1;
    }

    while (fscanf(fp, "%s", str1) != EOF) {
        printf("%s\n", str1);
    }

    fclose(fp);

    return 0;
}

// 実行結果
id:
1
name:
au
id:
2
name:
Sato

文末の0@以外は出力できたのですが、これだとidも文字列として認識されてしまうため、うまくいったかというと、あまりうまくいってないのかなと思います。
また後日修正してみたいと思います。