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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ストレガ
記事: 3
登録日時: 12年前

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

#1

投稿記事 by ストレガ » 12年前

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引数が文字列である必要性を教えていただけないでしょうか。よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 12年前

stackoverflow.com に全く同じ質問がありました。
file - C fopen mode parameter - Stack Overflow

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

ストレガ
記事: 3
登録日時: 12年前

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

#3

投稿記事 by ストレガ » 12年前

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

box
記事: 2002
登録日時: 15年前

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

#4

投稿記事 by box » 12年前

ストレガ さんが書きました: 追加で聞きたいのですが、reclenて何ですか???
レコード長(RECord LENgth)のことではないでしょうか。
推測に過ぎません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#5

投稿記事 by h2so5 » 12年前

reclenは特定のファイルシステムでレコード長を指定するオプションのようですが、具体的にこのオプションの指定が可能な環境があるのかどうかは分かりません。
Record-oriented filesystem

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

ストレガ
記事: 3
登録日時: 12年前

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

#6

投稿記事 by ストレガ » 12年前

返信ありがとうございます
確かに文字セットの指定などを考えると引数を文字列にするのがよさそうですね
色々謎が解けました

閉鎖

“C言語何でも質問掲示板” へ戻る