PDA

View Full Version : ファイルポインタ


nen-nen
2002/05/21, 09:03 PM
こんにちは、ねんネンです。

ファイルポインタで
FILE *file
do {
file = fopen("lock","r") ;
} while ( file != '\0' ) ;
のような使い方はできるのでしょうか?
(ファイルが開けなくなるまでループ)

ついでといっては何ですが、Perlでいうsleep関数(処理を待つ)はCではどのようにすれば良いのでしょうか?

dutch
2002/05/21, 10:43 PM
FILE *file
do {
file = fopen("lock","r") ;
} while ( file != NULL ) ;

ですね。



よくあるライブラリに
if( (file = fopen( "data", "r" )) == NULL )
printf("ファイルが開けません");

というのがありましたが、
file = fopen( "data", "r" )   ←コレは理解できる。

if( (ファイルを開く処理) == NULL )
の赤文字の部分が返す値がよくわかりません。
代入文を()でくくると、どの値が返ってくるのでしょう??

仮に自分の予想が当たっているとすると、
int a; if( (a=3) == 3) は、true になりますよね??
int a; if( (a=2) == 3) は、false ですよね??

さらに言うと
char a[]="aa"; char *b=&a;
if ( (*b='b') == &a ) と
if ( (*b='b') == 'b' ) の違いもお願いします。

gen-ta
2002/05/22, 03:37 PM
> FILE *file
> do {
>  file = fopen("lock","r") ;
> } while ( file != '\0' ) ;
> のような使い方はできるのでしょうか?

出来ます。
が、おそらく貴方の期待しない結果になります。
●同一のストリームで同一のファイルをオープンしても、 オープンした回数
 だけアドレスが準備されます。 そして、そのユニークなアドレス数にOSが
 制限を設定していた場合、ファイルが存在してもNULLが返ります。
●オープンだけならいいですが、読もうとしたら各々バッファメモリを消費します。
fclose()をループの中に置き、fopen()の回数だけfclose()すればOKです。
ただし、fopen()に失敗した、または、fopen()を呼んでないストリームを
fclose()する事は避けて下さい。DoubleFreeと同じく、動作不定義です。

> Perlでいうsleep関数

CPU無負荷をお望みならばシステムに強く依存するので、処理系毎の拡張機能
だと思います(たぶん)。一般にsleep() , usleep() , Sleep() といった名前です。

> 代入文を()でくくると、どの値が返ってくるのでしょう??

dutchさんの予想で正解です。()内の代入文は右端から実行され、左端の
変数の値となります。型もこの順番で評価され、左端の変数の型が採用されます。

> char a[]="aa"; char *b=&a;

&a==&(&a[0])を意図されてますか?

nen-nen
2002/05/22, 10:52 PM
ちょっと気になったんですがNULLと\0の違いは何なんでしょうか?

あと、
> FILE *file
> do {
>  file = fopen("lock","r") ;
> } while ( file != '\0' ) ;
> のような使い方はできるのでしょうか?
はファイルが存在しなければループ脱出
のようにしたいのですがもっと良い方法はないでしょうか?
ループ中に置くfclose()は1回目だけスキップするようにすればきちんとオープンとクローズが交互に繰り返されるはずです。この処理は投稿後に気がついて修正しました

gen-ta
2002/05/22, 11:16 PM
この辺りを調べて工夫するのがプログラミングの醍醐味だと思います。
こんな面白い事を人に譲るのはもったいないですよ。

denchu
2002/05/23, 12:30 AM
Originally posted by nen-nen
ちょっと気になったんですがNULLと\0の違いは何なんでしょうか?

NULL 空ポインタ
\0 文字列の終端を示す文字

って思ってたんだけど違うかな?

sskskhk
2002/05/23, 10:44 AM
確か stdio.h で
#define NULL 0
と定義されてたと思います

nen-nen
2002/05/23, 08:44 PM
#define NULL 0なんてのがあったんですね。。

ん〜んPerlなら-eとかでファイル検査できるんだけどなぁ。。
ファイルロックだったらflock()を使うのが無難かと思うのですがプログラムの汎用性としては落ちるんですよねぇ。。やっぱりそこのところは必要になるときまでの宿題ですかねぇ……

C/C++の関数のリファレンスとかWEBでありませんか?
関数に関してはいまいち良くわかってないのでもう少し勉強したいので。