2010年9月7日火曜日

BINMODE = バイナリモードで読み書きする(mawk,Gawk専用) - AWK

AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk △(書き出しのみ)mawk32 ○Mawk ×awk
オリジナルのAWK以外は、テキストファイル以外を読み書きする事も出来ます。

o 書き出しについては、コマンドで BINMODEを指定する方法にしないと、切り替わらないみたいです。
o 但し、mawk(とオリジナル)には、文字コード 0x00 を扱う事が出来ないという制限があります。

**** 書式
--------
BINMODE = モード
--------

o BINMODEは変数です。
o モード -- バイナリモードでファイルを開く事が出来ます。
   + 0 もしくは、空文字("") = 何もしません。テキストモードのままです。(初期値)
   + 1 = 読み込みのみ、バイナリモード
   + 2 = 書き出しのみ、バイナリモード
   + 3 = 読み込みと書き出しの両方で、バイナリモード

o Gawk on Windowsの場合は、文字で指定する事も出来ます。
   + r = 読み込みのみ、バイナリモード
   + w = 書き出しのみ、バイナリモード
   + その他の文字 = 読み込みと書き出しの両方で、バイナリモード

o 処理系によっては対応していない値があります。詳しくは、下の機能欄をご覧下さい。


**** 使用例(Gawk on Windowsの場合)
** 変数 BINMODE の設定例
o ファイルを読み込み前に書く方法
--------
BEGIN {
  BINMODE=1;
}
--------


o 実行コマンドの一部として書く方法(= 2や3にする時は、この方法で指定します)
--------
gawk -v BINMODE=1 -f a.awk in.txt > out.txt
--------


** 使用しているモードの確認方法
o 読み込みで使用しているモードの確認方法
--------
BEGIN {
  print "BINMODE = " BINMODE "\r";
}
{
  mode = (substr($0, length($0), 1) == "\r")? ("バイナリ"):("テキスト");
  print "読み込みは、" mode "モード\r";
  exit;
}
--------

o バイナリモードへの切り替えに成功すると、Windowsの改行コード \r\nの \rが、行末に現れます。
o 行末に"\r"を追加している理由は、書き出しがバイナリモードの時にも改行させたいからです。

o 書き出しで使用しているモードの確認方法
--------
BEGIN {
  print "BINMODE = " BINMODE;
  print "です。";
  print "メモ帳で開いた時に、BINMODE以降が1行で表示されたら、バイナリモード。";
  print "(Windows XPで確認しました)";
}
--------

o こちらは、ファイルの改行コードが\nだけの時、メモ帳で開くと改行されない事を利用しています。


**** 機能
o この変数を使うと、ファイルの読み書き時、バイナリモードに設定する事が出来ます。
o 目的のファイルを開く前に指定する必要があります。
   + 書き出しについては、コマンドで BINMODEを指定する方法にしないと、切り替わらないみたいです。
o 詳細は、書式説明の通りです。
o この機能をサポートしていない処理系があります。

** テキストモードとバイナリモードの違いについて
o バイナリモード = ファイルを読み書きする時、改行コードを自動変換しません。
o テキストモード = "\n"とWindowsファイルの改行コード "\r\n"を自動変換します。
   + ファイルの改行コードは、システムによって異なります。
   + 例えば、UNIX標準の改行コードは、"\n"。
   + ですので、同じAWKでも、Windows版とUNIX版では、改行コードの扱いが異なります。
o 通常は、テキストモードの方が便利です。困った時に切り替えます。

** 処理系に依存する動作
o 表の通りです。
o 但し、mawk(とオリジナル)には、文字コード 0x00 を扱う事が出来ないという制限があります。
o バイナリデータの完全な読み書きについては、実用上、他の手順や知識も必要になります。
    + 「AWKでバイナリ出力する方法」(mawk, Gawk専用)
    + 「AWKでバイナリ入力する方法」(Gawk専用)

バイナリモードになる条件
BINMODE
の値
Gawk on
Windows
3.1.7
Gawk for
Windows
3.1.6
mawk32
1.3.3
Mawk for
Windows
1.3.3
awk
(May 1,
2007)
説明
 R = 読み込み / W = 書き出し 
0×××××何もしません。テキストモード
(空文字)×××××何もしません。テキストモード
1RR×R×読み込みをバイナリモード
rR××××読み込みをバイナリモード
2WWWW×書き出しをバイナリモード
wW××××書き出しをバイナリモード
3RWRWWRW×両方をバイナリモード
rwRW××××両方をバイナリモード
wrRW××××両方をバイナリモード
RRW××××両方をバイナリモード
WRW××××両方をバイナリモード
o UNIX版では、この機能をサポートしていない事があります。
   + モードを切り替えても、改行文字は同じだからです。
   + 少なくとも、mawk 1.3.3の場合は、Windows版(とMS-DOS版)のみが対応していました。


**** 確認した処理系
o Gawk on Windows 3.1.7 -- 文字でも指定可能
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3 -- 書き出しのみ対応
o Mawk for Windows 1.3.3
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの入出力関数とコマンド実行機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > /inet = AWKからインターネットにアクセスする
    /dev/stdout = 標準出力を示すファイル名
    /dev/stderr = 標準エラー出力を示すファイル名
    +
    AWKでバイナリ出力する方法(mawk, Gawk専用)
    AWKでバイナリ入力する方法(Gawk専用)
    AWKプログラムの中で、8進数や16進数を使う方法
    getline = ファイル(やパイプ)から1行読み込む
    printf = 文字列を組み立ててファイルなどに書き出す
    print = ファイルなどに書き出す
(2011年7月29日訂正。使用例のコマンド記述は -f awkファイル名)
(2010年10月5日変更。メモ欄の記述を、処理系に依存する動作欄に統合)
(2010年9月7日変更。15時頃と17時頃に自動公開したのは作成中のもの。書き直したものを改めて公開)