プロが教えるわが家の防犯対策術!

C言語のファイル処理するにあたってランダムファイル処理を行うには,バイナリモードが適しているわけであるが,その理由を調べたいのですがいまいちよくわかりません.どなたか教えてくれませんか?

A 回答 (4件)

ファイルがレコードで構成されている時、


レコードのサイズが一定なら、
任意の番号のレコードに(位置決めして)ランダムにアクセスすることができるが、
\n<->\r\nの様に勝手に変換されてしまうモードでは、
レコード中の\nの個数が不定の場合レコードサイズが変わってしまい、ランダムアクセスはできない。
    • good
    • 0

#1です。

実際に試してみるだけではわからないことがあるので、補足しておきます。というか、これだけでも十分に回答になるような気がしますが...

C言語の標準規格では、fseekの仕様が次のようになっています。

バイナリストリームの場合、(シーク後の)新しい位置は、SEEK_SET/SEEK_CUR/SEEK_ENDで指定した位置にオフセットを加えたものになります。ただし、SEEK_ENDの指定が期待通りの動作になるかどうかは処理系に依存します。

テキストストリームの場合、SEEK_CURまたはSEEK_ENDを指定した場合のオフセットは0でなければなりません。SEEK_SETを指定した場合のオフセットは0または以前にftellが返した値でなければなりません。

つまり、テキストストリームの場合、以前にftellによってブックマークした位置か、ファイルの先端と終端にしかランダムアクセスできないことになります。

なお、fseek以外の方法でファイル位置表示子を変えることができる標準関数は、fsetposとrewindだけですが、前者は以前にfgetposを呼び出した位置にしか移動できませんし、後者は先端にしか移動できません。
    • good
    • 0

言語はCに限らない。


アクセスモード以前に、バイナリ形式のファイルと、plain textファイルとの違いを理解していますか?

テキストファイル(例えばあなたの書く~.cファイル)を開いたとして、
18行目がどこになるか。

これを見つけるためには、先頭から走査して
改行を示すバイト列(0x0d0a, 0x0aないし0x0d)の出現回数を数えないといけない。
(各行の文字数は一致しない前提)
 
で、バイナリファイルの場合、
塊のサイズ * offset で、何番目の塊にでも
一気にアクセスできる。

これが理由です。
    • good
    • 0

実際に、バイナリモードとテキストモードを使って、ランダムアクセス処理をやってみるのが一番です。


他人からの受け売りではなく、実体験に基づいた、中身のある結論に到達すると思います。

なお、その際には、バイナリモードとテキストモードで差が現れる処理系を使う必要があります。具体的には、Unix系は避けた方がよいでしょう。あるいは、ワイド文字を使うかです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!