BINMODE = バイナリモードで読み書きする(mawk,Gawk専用) - 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 | × | × | × | × | × | 何もしません。テキストモード |
(空文字) | × | × | × | × | × | 何もしません。テキストモード |
1 | R | R | × | R | × | 読み込みをバイナリモード |
r | R | × | × | × | × | 読み込みをバイナリモード |
2 | W | W | W | W | × | 書き出しをバイナリモード |
w | W | × | × | × | × | 書き出しをバイナリモード |
3 | RW | RW | W | RW | × | 両方をバイナリモード |
rw | RW | × | × | × | × | 両方をバイナリモード |
wr | RW | × | × | × | × | 両方をバイナリモード |
R | RW | × | × | × | × | 両方をバイナリモード |
W | RW | × | × | × | × | 両方をバイナリモード |
+ モードを切り替えても、改行文字は同じだからです。
+ 少なくとも、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時頃に自動公開したのは作成中のもの。書き直したものを改めて公開)