fwriteとprintf

grepとlsでパイプ後に色が出る出ないの違いについて、もしかしたらprintfとfwriteの違いなのかもしれないと、ふと思いつきました。
各manを確認します。

man 3 printf。

PRINTF(3)                  Linux Programmer's Manual                 PRINTF(3)

名前
       printf,   fprintf,  sprintf,  snprintf,  vprintf,  vfprintf,  vsprintf,
       vsnprintf - 指定された書式に変換して出力を行う

書式
       #include <stdio.h>

       int printf(const char *format, ...);
       int fprintf(FILE *stream, const char *format, ...);
       int sprintf(char *str, const char *format, ...);
       int snprintf(char *str, size_t size, const char *format, ...);

~省略~

次に、man 3 fwrite。

FREAD(3)                   Linux Programmer's Manual                  FREAD(3)

名前
       fread, fwrite - バイナリストリームの入出力

書式
       #include <stdio.h>

       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

       size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);

説明
       fread()   関数は stream ポインターで指定されたストリームから nmemb 個の
       データを読み込み、 ptr で与えられた場所に格納する。 個々のデータは size
       バイトの長さを持つ。

       fwrite()   関数は  ptr  で指定された場所から得た  nmemb  個のデータを、
       stream ポインターで指定されたストリームに書き込む。 個々のデータは size
       バイトの長さを持つ。

fwriteはあくまでもバイナリストリームなので、これが色が付く理由なのかもしれない!
(間違ってるかもしれませんが)
Cプログラミングで確認してみましょう。

takk@deb9:~/tmp$ cat -n fwrite-sample.c
     1  #include <stdio.h>
     2  #include <string.h>
     3
     4  int main()
     5  {
     6
     7          char *dat = "\33[33mYELLOW\n\33[49;39m\n";
     8
     9          fwrite(dat, sizeof(char), strlen(dat), stdout);
    10
    11  }
takk@deb9:~/tmp$

実行してみます。

色つきますね。
ではパイプを通すとどうなるか。

おっ、黄色のままです。
やはり、fwriteを使うと色が出る、が正解でしょうか。

でも、まだ分かりません。printfでもやってみます。

takk@deb9:~/tmp$ cat -n printf-sample.c
     1  #include <stdio.h>
     2
     3  int main()
     4  {
     5          printf("\33[33m");
     6          printf("YELLOW\n");
     7          printf("\33[49;39m\n");
     8  }
takk@deb9:~/tmp$

簡単なプログラムですね。
実行してみます。

黄色出ました。

パイプ後に、白に戻っていたら当たりです。

あれ、黄色のままです。
printfでもちゃんとエスケープシーケンス出てますね。どういうことでしょう。
謎は深まる。

つづく

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA