ページ 11

fopen関数の第2引数がなぜ文字列なのか

Posted: 2013年12月09日(月) 17:10
by ストレガ
c言語のfopen関数の第2引数はなぜ文字列なのですか。
c言語は文字列操作が苦手という勝手なイメージがあるのですが、なぜわざわざ文字列にしたのか不思議でたまりません。
例えば第2引数をint型にして

コード:

#define FILE_READ (1)
#define FILE_WRITE (1<<1)
#define FILE_BINARY (1<<2)
とマクロ定義すれば

コード:

fopen("filename",FILE_READ); //読み取り専用で開く
fopen("filename",FILE_WRITE | FILE_BINARY); //バイナリモードで書き込み専用
と書けます。windows.hのMessageBox関数などを見ているとこちらの書き方の方が自然な気がします。
第2引数が文字列である必要性を教えていただけないでしょうか。よろしくお願いします。

Re: fopen関数の第2引数がなぜ文字列なのか

Posted: 2013年12月09日(月) 18:32
by h2so5
stackoverflow.com に全く同じ質問がありました。
file - C fopen mode parameter - Stack Overflow

結論から言えば、文字列になっているのは複雑なオプションを指定できるようにするためようです。(例えば、リンク先で触れられている"wb,reclen=80" のような)
フラグだけの場合はビットマスクの方が便利ですが、パラメーターにも対応したい場合は文字列にしたほうが無難ということでしょうか。

Re: fopen関数の第2引数がなぜ文字列なのか

Posted: 2013年12月09日(月) 20:21
by ストレガ
返信ありがとうございます
本やサイトでfopenがパラメータを取るという記述を見たことが無く、完全にフラグだけと勘違いしていました。
追加で聞きたいのですが、reclenて何ですか???
あとこのようなパラメータは他に何があるのですか?
詳しく教えていただけませんか。

Re: fopen関数の第2引数がなぜ文字列なのか

Posted: 2013年12月09日(月) 21:17
by box
ストレガ さんが書きました: 追加で聞きたいのですが、reclenて何ですか???
レコード長(RECord LENgth)のことではないでしょうか。
推測に過ぎません。

Re: fopen関数の第2引数がなぜ文字列なのか

Posted: 2013年12月09日(月) 21:19
by h2so5
reclenは特定のファイルシステムでレコード長を指定するオプションのようですが、具体的にこのオプションの指定が可能な環境があるのかどうかは分かりません。
Record-oriented filesystem

他には ccs=ENCODING で文字セットを指定できるようです。
http://msdn.microsoft.com/ja-jp/library/yeby3zcb.aspx

Re: fopen関数の第2引数がなぜ文字列なのか

Posted: 2013年12月09日(月) 22:06
by ストレガ
返信ありがとうございます
確かに文字セットの指定などを考えると引数を文字列にするのがよさそうですね
色々謎が解けました