Unix / Linux - 标准I/O流

こんにちは、未来のLinux魔法使いさんたち!今日は、UnixとLinuxの標準I/O流の魔法の世界に飛び込みます。プログラミングが初めてであっても心配しないでください。この冒険のなかであなたの親切なガイドになるつもりです。これまでに数多くの学生たちに教えてきたように。では、仮想のバックパックを持ち出して、一緒に探検しましょう!

Unix / Linux - Standard I/O Streams

標準I/O流とは?

具体的な内容に入る前に、標準I/O流とは何かを理解しましょう。これらは、あなたのプログラムが外部の世界と通信するための特別なチャネルだと思ってください。私たち人間が異なる方法で交流するように(話す、聞く、そしてことが悪いときに叫ぶ)プログラムにもこれらのストリームがあります。

主に3つのストリームがあります:

  1. 標準入力(stdin)
  2. 標準出力(stdout)
  3. 標準エラー(stderr)

それぞれを詳しく説明しましょう。

標準入力(stdin)

標準入力、またはstdinは、プログラムの耳のようなものです。これは、プログラムがユーザーや他のソースからの情報を聞く方法です。

例1: stdinからの読み取り

#include <stdio.h>

int main() {
char name[50];
printf("あなたの名前は何ですか? ");
scanf("%s", name);
printf("こんにちは、%s!\n", name);
return 0;
}

この例では、scanfがstdinから読み取ります。このプログラムを実行すると、何かをタイプしてEnterキーを押すのを待ちます。これがstdinの動作です!

標準出力(stdout)

標準出力、またはstdoutは、プログラムの口のようなものです。これは、プログラムが私たちに結果やメッセージを表示する方法です。

例2: stdoutへの書き込み

#include <stdio.h>

int main() {
printf("こんにちは、世界!\n");
fprintf(stdout, "これもstdoutにいく。\n");
return 0;
}

printffprintf(stdout, ...)の両方がstdoutに書き込みます。このプログラムを実行すると、両方のメッセージがターミナルに表示されます。

標準エラー(stderr)

標準エラー、またはstderrは、プログラムが何かが間違ったときに叫ぶ方法のようなものです。これはエラーメッセージや診断に使用されます。

例3: stderrの使用

#include <stdio.h>

int main() {
FILE *file = fopen("存在しないファイル.txt", "r");
if (file == NULL) {
fprintf(stderr, "エラー: ファイルを開けません。\n");
return 1;
}
// 残りのコード...
return 0;
}

ここで、ファイルが存在しない場合、fprintf(stderr, ...)を使ってエラーメッセージを表示します。

ストリームのリダイレクト

ここでの話は非常に興味深いものになります!Unix/Linuxでは、これらのストリームをリダイレクトできます。これは、プログラムに異なる耳や口を与えるようなものです。以下にどうするか見せましょう:

stdinのリダイレクト

$ ./program < input.txt

これはinput.txtから入力を取得します。

stdoutのリダイレクト

$ ./program > output.txt

これは出力をoutput.txtに送ります。

stderrのリダイレクト

$ ./program 2> error.txt

これはエラーメッセージをerror.txtに送ります。

パイプ: プログラムの接続

ここに素晴らしい技があります。プログラムの出力を別のプログラムの入力に接続するためにパイプ(|)を使うことができます。まるでプログラムが電話遊びをしているかのようです!

$ echo "こんにちは、世界!" | wc -w

これは"こんにちは、世界!"の単語数を数えます。echoの出力がwcの入力になります。

標準I/O関数

これらのストリームで使用される一般的な関数を見てみましょう:

関数 説明 ストリーム
scanf フォーマットされた入力を読み取る stdin
printf フォーマットされた出力を書き込む stdout
fprintf フォーマットされた出力をストリームに書き込む 任意
fgets 文字列を読み取る 任意
fputs 文字列を書き込む 任意
fread バイナリデータを読み取る 任意
fwrite バイナリデータを書き込む 任意

個人的なエピソード

初めてこの概念を教えたとき、生徒がこう尋ねました。「でも教授、なぜ異なるストリームが必要なのですか?全部を一つで使えないんですか?」微笑んで私は言いました。「 imagine you're in a noisy restaurant. You speak to order food, listen to hear when your order is ready, and you might shout if there's a problem with your order. That's why we have different streams - each has its purpose! 」

結論

標準I/Oストリームの理解は、プログラム通信のABCを学ぶようなものです。これは、プログラミングの旅で遭遇するより高度な概念の基礎となります。すべての素晴らしいプログラマーはあなたが今いる場所から始まります。練習を続け、好奇心を持ち続けてください。間もなくあなたもプロのようにデータをストリーミングするでしょう!

未来の技術スターたち、ハッピーコーディング! ?

Credits: Image by storyset