これから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;
}
実行手順
1.MSYS2 bashでコンパイル
gcc -o a.exe diary.c
2.Windowsの cmd.exe
で実行
>chcp 65001
>a.exe
cmd.exe で chcp 65001 を実行してから a.exe を実行すると、UTF-8出力が正しく表示される。
実行結果(期待される動作)
cmd.exe
でchcp 65001
を実行しているため、UTF-8が有効fgets()
はstdin
から UTF-8 文字列を受け取る(ただし、WindowsのロケールがCP932なら、実際はShift_JIS)
Windows版VSCodeのUCRT64ターミナルでは、C言語で作成したWindowsアプリケーションの出力がShift_JIS(CP932)で行われることがあり、UTF-8を前提とするターミナルとの間で文字コードの不一致が生じ、文字化けが発生することがある。
これは、Windowsアプリケーションの出力文字コードとターミナルの表示文字コードが一致していないことが原因である。
一方、cmd.exe で chcp 65001 を実行してUTF-8コードページに切り替えることで、出力がUTF-8として扱われ、文字化けを回避できる。
コメント