fputでエラー?

[戻る]
Fj 2002/10/18(金) 11:00:41
VC++6で使っています。
ある関数Aの中で
A(int *B, int C, int *D, float *E)
{
  int   i;
  FILE  *fu;
  int   r;

  if (fu = fopen("F.doc","w") == NULL)   /* Open CodeBook */
  {
    printf("file open error!!\n");
    exit(1);
  }
  for (i = 0; i < 44; i++)
    fputc(B[i],fu);

とやったら、実行時、いきなりi=0で上記fputでハングです。
確かに、このfputに入る直前に、B[0]〜B[43]までを
実値で見れているのも確認しているし、
ここをB[i]の代わりに、"5"や"30"等の固定数字でやっても同じ。

if (r = fput(B[i],f) == NULL)
{
 printf("File Writing Error! \n");
 exit(2);
}
などと変えてもエラーの内容は、変わらないのですが、
==============================
Debug AssertionFailed!
Program:C:VC\DEBUG\TEST.EXE
File: fput.c
Line:45

Expression: str != NULL

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
==============================
一体何が悪いのでしょうか?
他の個所では特にMainの中で同等なfputをしても
通過しているのに。



又、別な次元の質問ですが、
parameter付きの戻り値を期待しない関数の中で
return;を書かなければ、確かに
コントロールはMainの方に戻っていくようですが、
何か不具合はあるのでしょうか?

2002/10/18(金) 11:46:14
>  for (i = 0; i < 44; i++)
>    fputc(B[i],fu);
>
>とやったら、実行時、いきなりi=0で上記fputでハングです。
>確かに、このfputに入る直前に、B[0]〜B[43]までを

fput, fputc どっちでエラーなんでしょうか?
もし、fput だとしたら、 fput とはどんなものですか?
それに、状況からするとアサーションで引っ掛っているだけでハングアップ
ではない様ですが?

beginner 2002/10/18(金) 12:04:44
演算子の優先度を考慮してもう一度考えてみましょう。

>if (fu = fopen("F.doc","w") == NULL)   
この部分は恐らく”F.docが開けなかったら”
を期待してるのでしょうが・・・

このあたりで Warningが出ると思いますが。

それとデバッグをまずしてみてください。
F9でブレークポイントを貼ってF5でデバッグ実行すれば
って世話の焼きすぎですか・・・^^;

アイススケーター 2002/10/18(金) 12:11:37
↓でコンパイルエラーになりました。
 > if (fu = fopen("F.doc","w") == NULL)   /* Open CodeBook */
 
  if ( (fu = fopen("F.doc","w") ) == NULL)   /* Open CodeBook */

に変更すると、コンパイルも通り、ファイルも書き込まれました。

Fj 2002/10/18(金) 12:36:44
もともとはfputで使っていました。(今デバッグモードで見ています)
何故か今、fputchar
に変えてみたら通るようになりましたが、
今度はfcloseで、”ACCESS VIOLATION。fclose.cのパスを入力されたし。”、なるエラーが
出て来てしまいました。

if (fu = fopen("PreEnpd.wav","w") == NULL)  
{
         printf("file open error!!\n");
         exit;
}
for (i = 0; i < 44; i++)
    fputc(B[i],fu);
fclose(fu);

アイススケーター 2002/10/18(金) 12:57:30
あと、書き忘れてましたが、このプログラムの場合は、
バイナリーモードを利用したほうがよいと思います。
fopen("F.doc","w")ではなく
fopen("F.doc","wb") とされたほうがよいと思います。

beginner 2002/10/18(金) 13:22:23
アイススケーターさんや私の意見は無視ですか・・・
寂しいですねぇ。

アイススケーター 2002/10/18(金) 15:00:11
beginnerさんへ

 時間軸から考えて、島さんに対するメッセージを検討中で
 データが更新されているのをFjさんが気づかなかっただけじゃ
ないかと思います。

 そのうち、何か書かれてきますよ。

Fj [E-Mail] 2002/10/21(月) 13:24:16
[[解決]]
そうなんです。

私も後で
if ((fu = fopen("F.doc","w")) == NULL)  
にしないときずきました。

確かに時間的に当時はbeginnerさんの記事出ていなかったようです。

返事送れてすみません。

beginner 2002/10/21(月) 15:30:49
いいえ。こちらこそ大人気なくて申し訳ないです。
頑張ってください。

古いスレッドには追加発言できません。