🧩 はじめに
C言語の基礎で学んだ「構造体」「関数」「記憶クラス」「ファイル操作」を組み合わせて、
実際の業務処理にも応用できる 電文処理プログラム を作成します。
この応用例では以下の処理を行います:
日付・時間・番号・データ長・入力電文を受け取る
入力電文が Shift-JIS(S-JIS) か JISコード かを判定
S-JIS の場合、キューに格納
別プログラムでキューを読み出し、構造体に格納
各項目の間に タブ(\t) を入れて1行形式で出力
入力電文は 16進数ダンプ形式(1文字2バイト)で出力
🧩 電文処理の全体構成
機能 内容
入力受信 日付・時間・番号・電文データを受け取る
判定処理 isJIS()関数でS-JIS/JISを判定
格納処理 extern宣言した共有キューにpush
読み込み 別プログラムでキューからpopして構造体に格納
出力 各項目をタブ区切り・16進ダンプでファイル出力
🧩 構造体とキュー定義例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_QUEUE 100
typedef struct {
char date9; // YYYYMMDD
char time7; // HHMMSS
int number;
int length;
unsigned char data256; // 電文データ
} Message;
typedef struct {
Message messagesMAX_QUEUE;
int front, rear;
} MessageQueue;
extern MessageQueue sharedQueue;
🧩 文字コード判定関数
int isJIS(const char* input) {
// ESCシーケンスを含む場合 → JIS
if (strstr(input, "\x1B$B") || strstr(input, "\x1B(J"))
return 1;
return 0;
}
🧩 キュー操作関数
void enqueue(MessageQueue* q, Message msg) {
if ((q->rear + 1) % MAX_QUEUE == q->front) {
printf("Queue Full!\n");
return;
}
q->messagesq->rear = msg;
q->rear = (q->rear + 1) % MAX_QUEUE;
}
Message dequeue(MessageQueue* q) {
Message msg;
memset(&msg, 0, sizeof(msg));
if (q->front == q->rear) {
printf("Queue Empty!\n");
return msg;
}
msg = q->messagesq->front;
q->front = (q->front + 1) % MAX_QUEUE;
return msg;
}
🧩 メイン処理(電文受信側)
int main(void) {
Message msg = {"20251022", "213000", 1001, 12, "テスト電文"};
if (!isJIS((const char*)msg.data)) {
enqueue(&sharedQueue, msg);
printf("S-JIS 電文をキューに格納しました。\n");
} else {
printf("JIS 電文は処理対象外です。\n");
}
return 0;
}
🧩 別プログラム(電文出力側)
void outputMessages(MessageQueue* q) {
FILE* fp = fopen("output.txt", "w");
if (!fp) return;
while (q->front != q->rear) {
Message msg = dequeue(q);
fprintf(fp, "%s\t%s\t%d\t%d\t",
msg.date, msg.time, msg.number, msg.length);
for (int i = 0; i < msg.length; i++)
fprintf(fp, "%02X", msg.datai);
fprintf(fp, "\n");
}
fclose(fp);
}
🧩 実行結果(例)
20251022 213000 1001 12 834583658389834583
🧩 ポイントまとめ
概念 使用箇所 学べること
extern変数 共有キュー モジュール間共有
static変数 Queue内操作 スコープ管理
構造体 Message 複数データの一括管理
文字コード判定 isJIS() バイト列解析
ファイル出力 outputMessages 実践的なフォーマット出力