fputでエラー? – プログラミング – Home

通知
すべてクリア

[解決済] fputでエラー?


Fj
 Fj
(@Fj)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

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の方に戻っていくようですが、
何か不具合はあるのでしょうか?


引用未解決
トピックタグ
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

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

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


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
 

演算子の優先度を考慮してもう一度考えてみましょう。

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

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

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

↓でコンパイルエラーになりました。
> if (fu = fopen(F.doc,w) == NULL) /* Open CodeBook */

  if ( (fu = fopen(F.doc,w) ) == NULL) /* Open CodeBook */

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


返信引用
Fj
 Fj
(@Fj)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

もともとは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);


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

あと、書き忘れてましたが、このプログラムの場合は、
バイナリーモードを利用したほうがよいと思います。
fopen(F.doc,w)ではなく
fopen(F.doc,wb) とされたほうがよいと思います。


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
 

アイススケーターさんや私の意見は無視ですか・・・
寂しいですねぇ。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

beginnerさんへ

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

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


返信引用
Fj
 Fj
(@Fj)
ゲスト
結合: 23年前
投稿: 3
 

そうなんです。

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

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

返事送れてすみません。


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
 

いいえ。こちらこそ大人気なくて申し訳ないです。
頑張ってください。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました