C言語関係掲示板

過去ログ

No659 fseekのoffsetにLは必要か

[戻る] [ホームページ]
No.7281

fseekの使い方
投稿者---ともひろ(2003/06/10 23:06:24)


fseekの使い方はfseek(fp,10L,SEEK_SET)などのように使いますが、
10LのLって必要なのでしょうか?また、つけるとどうなるのでしょう?
教えてください。

No.7283

Re:fseekの使い方
投稿者---こん!(2003/06/10 23:14:42)


>fseekの使い方はfseek(fp,10L,SEEK_SET)などのように使いますが、
>10LのLって必要なのでしょうか?また、つけるとどうなるのでしょう?
>教えてください。

こういう事です。

#define LONG_MAX +2147483647L
#define LONG_MIN -2147483647L


No.7284

Re:fseekの使い方
投稿者---ともひろ(2003/06/10 23:19:38)


>>fseekの使い方はfseek(fp,10L,SEEK_SET)などのように使いますが、
>>10LのLって必要なのでしょうか?また、つけるとどうなるのでしょう?
>>教えてください。
>
>こういう事です。
>
>#define LONG_MAX +2147483647L
>#define LONG_MIN -2147483647L


今までLをつけないでfseekを使ってました。
とくに問題がなかったようなんですけど・・・?


No.7288

Re:fseekの使い方
投稿者---こん!(2003/06/10 23:46:28)


>とくに問題がなかったようなんですけど・・・?

intで表現出来る値の範囲内でシークさせる分には問題ありません。コンパイル時
に型変換が行われる事もあるでしょうから。
ただintの範囲外までシークさせようとした時にこれが必要になるだけです。

といっても昨今の32ビットCPUではどちらも32ビット幅という事になり扱える
値はどちらも

>#define LONG_MAX +2147483647L
>#define LONG_MIN -2147483647L

という事になりますね。
結局環境依存により影響が出てくるという事になるかと思います。
一応引数の型はこうなっていますから合わせておいた方がそういった心配も
無くなるとは思いますが。


No.7289

Re:fseekの使い方
投稿者---こん!(2003/06/11 00:02:14)


>今までLをつけないでfseekを使ってました。

それと整数定数だとunsigned longで扱われる事になり最大値が
4,294,967,295までになりますね。

No.7291

Re:fseekの使い方
投稿者---ともひろ(2003/06/11 00:25:54)


>>今までLをつけないでfseekを使ってました。
>
>それと整数定数だとunsigned longで扱われる事になり最大値が
>4,294,967,295までになりますね。

コンさんありがとうございました

No.7374

Re:fseekの使い方
投稿者---こん!(2003/06/13 11:10:45)


亀レスですが参考までに。

よそでたまたまこんな話題が上っていました。

No.7293

Re:fseekの使い方
投稿者---ともじ(2003/06/11 00:53:55)


こんばんは。

>今までLをつけないでfseekを使ってました。
>とくに問題がなかったようなんですけど・・・?

単に「10」とすると、int型整数定数になります。fseekの書式は、
  int fseek(FILE *fp, long offset, int origin); 

なので、long型にするために「10L」としますが、これは「10」でも
支障はありません。

実引数int型、仮引数long型の場合には、実引数はlong型に変換されて
から渡されます。ですから、int型のままでも問題はありません。
ただ、long型の仮引数に渡すので、接尾語Lを付けて、long型の
実引数にした方がよいと言うことでしょう。

なお、long型サイズの定数の場合は、接尾語がなくてもlong型ですから、
わざわざLをつける必要はないですね。long型を越える場合には、long型
のoffsetには渡せません。

初級C言語Q&A(16)の【キャストは必要か】も参照してください。
http://www.st.rim.or.jp/~phinloda/cqa/cqa16.html