これからC言語で簡単な「ミニ日記アプリ」を作っていこう。
最初は、最低限の機能(入力と表示)のみを装備するが、徐々に機能を追加していく。
機能の概要
- ユーザーが日記の内容を入力する。
- 現在の日時を取得(time.hを使用)する。
- 日記内容と日時をファイルに追記(aモード)する。
- 終了時に「保存しました。」と表示する。なお、入力がない場合「入力が空です。保存しません。」と表示する
使用する主な関数・ライブラリ
機能 | 関数・ライブラリ |
日時取得 | time(), localtime(), strftime() |
ファイル操作 | fopen(), fprintf(), fclose() |
入力処理 | fgets() |
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(void) {
char diary[1024];
time_t now = time(NULL);
struct tm *t = localtime(&now);
char timestamp[100];
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", t);
printf("今日の日記を入力してください(Enterで終了):\n");
if (fgets(diary, sizeof(diary), stdin) == NULL) {
fprintf(stderr, "入力に失敗しました。\n");
return 1;
}
// 改行を取り除く
size_t len = strlen(diary);
if (len > 0 && diary[len - 1] == '\n') {
diary[len - 1] = '\0';
}
// 空文字列ならスキップ
if (strlen(diary) == 0) {
printf("入力が空です。保存しません。\n");
return 0;
}
FILE *fp = fopen("diary.txt", "a");
if (fp == NULL) {
perror("ファイルを開けませんでした");
return 1;
}
fprintf(fp, "[%s]\n%s\n\n", timestamp, diary);
fclose(fp);
printf("日記を保存しました。\n");
return 0;
}
実行結果
>今日の日記を入力してください(Enterで終了):
入力が空です。保存しません。
>今日の日記を入力してください(Enterで終了):
今日はとても暑い日です。
日記を保存しました。
>cat diary.txt
[2025-08-03 09:41:12]
今日はとても暑い日です。
なお、Windows版のVSCodeでコンパイルして、ターミナルウインドウ(UCRT64)で日本語の文字化けが発生する場合、以下のコードを試していただきたい。
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <locale.h>
int main(void) {
setlocale(LC_ALL, "ja_JP.UTF-8");
char diary[1024];
time_t now = time(NULL);
struct tm *t = localtime(&now);
char timestamp[100];
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", t);
printf("今日の日記を入力してください(Enterで終了):\n");
if (fgets(diary, sizeof(diary), stdin) == NULL) {
fprintf(stderr, "入力に失敗しました。\n");
return 1;
}
size_t len = strlen(diary);
if (len > 0 && diary[len - 1] == '\n') {
diary[len - 1] = '\0';
}
if (strlen(diary) == 0) {
printf("入力が空です。保存しません。\n");
return 0;
}
FILE *fp = fopen("diary.txt", "a"); // ← "ab" から "a" に変更
if (fp == NULL) {
perror("ファイルを開けませんでした");
return 1;
}
fprintf(fp, "[%s]\n%s\n\n", timestamp, diary);
fclose(fp);
printf("日記を保存しました。\n");
return 0;
}
今後は、このコードを基に機能の拡張を行っていこう。
コメント