C 言語で stderr に出力
-
C 言語で
stderr
に出力するにはfprintf
関数を使用する -
関数
dprintf
を用いて C 言語のstderr
に出力する -
関数
fwrite
を用いて C 言語のstderr
に出力する
この記事では、C 言語で stderr に出力する方法について複数の方法を紹介します。
C 言語で stderr
に出力するには fprintf
関数を使用する
C の標準 I/O
ライブラリには、プログラムがシステム上で起動されたときに暗黙的に開かれる 3つのテキストストリームが用意されています。これらのストリームは以下の通りです。
- 標準入力 (
stdin
) - 入力の読み込みに用いられます。 - 標準出力 (
stdout
) - 出力を書き込むために使用します。 - 標準エラーストリーム (
stderr
) - 実行時にエラーやデバッグメッセージを記録するために利用します。
これらのストリームにデータを出力するためには、printf
ファミリの関数を利用します。fprintf
は通常、特定の出力ストリームにテキストを出力するために用いられます。stderr
に出力する必要がある場合、stderr
のストリームをターゲットにして、関数の第 1 引数にそれを渡します。第 2 引数はフォーマット文字列そのものであり、出力に異なるオブジェクトを含めてフォーマットを構築するための手段を提供します。複数の文字列はコンパイル中に自動的に連結されるので、""
には複数の文字列を含めることに注意してください。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, RED "[ERROR]" NC
": No string argument provided! \n"
"You must provide a program path as argument\n");
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
出力:
[ERROR]: No string argument provided!
You must provide a program path as argument
関数 dprintf
を用いて C 言語の stderr
に出力する
あるいは、dprintf
関数を利用することもできます。これは fprintf
コールと似ていますが、ファイルディスクリプタを第一引数に取ることを除いては似ています。Unix ベースのシステムでは、ファイルディスクリプタはプログラムのオープンファイルに関連付けられた整数値です。
標準の Unix ヘッダ - <unistd.h>
には、STDIN_FILENO
、STDOUT_FILENO
、STDERR_FILENO
という 3つのストリームのマクロ定義が含まれていることに注意してください。また、RED
と NC
という 2つのマクロも定義しています。これらは、出力のテキスト色を変更するための ASCII 文字列です。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
dprintf(STDERR_FILENO, RED "[ERROR]" NC
": No string argument provided! \n"
"You must provide a program path as argument\n");
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
出力:
[ERROR]: No string argument provided!
You must provide a program path as argument
関数 fwrite
を用いて C 言語の stderr
に出力する
前の関数のもう一つの代替案は fwrite
です。これは主にバイナリストリームの入出力に用いられるが、出力ストリームにテキストを出力するために呼び出すこともできます。fwrite
は 4つの引数を取り、最初の引数は出力する必要のある文字列へのポインタです。次の 2つの引数はポインタに格納されているデータ項目の数とそれぞれのサイズを指定します。1つの文字列を出力するので、第 3 引数には 1
を指定することができ、サイズは文字列の長さに対応します。第 4 引数には指定したいストリームを指す FILE*
を指定します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
fwrite("[ERROR] : No string argument provided!\n", 39, 1, stderr);
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
出力:
[ERROR] : No string argument provided!