特定のループ回数でのfopenでエラーNULLが返る。 – 固定ページ 2 – プログラミング – Home

特定のループ回数でのfopenでエラー...
 
通知
すべてクリア

特定のループ回数でのfopenでエラーNULLが返る。

固定ページ 2 / 3

たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

というか、その GetLastError って
fopen でエラーが起こった直後で取得していますか

fopen で NULL が返ってきたものを、他の関数に与えてエラー起こしてるのなら
そりゃ「ハンドルが無効です」で合ってるのではないですか

これだけ単純なことに関して、これだけみなさんからヒント頂いて
何もまともにやっていないように思われるのは。。。

答えるの無駄かなぁって思っちゃいます

日本語を書くのも読むのもだめな人なのかなぁ。。。


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

> http://www.microsoft.com/japan/support/kb/articles/94/9/99.asp

これをもうちょっと簡単にすると、こう:

TCHAR buf[ 512 ];
FormatMessage( 0x1000, 0, GetLastError(), 0x400, buf, 512-1, 0 );
::OutputDebugString( buf );

こいつをfopen()の直後に置く。


返信引用
ふじ
 ふじ
(@ふじ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

皆さんからのご指摘りがとうございます。
テキストそのものがコードの中で現れるように
実装します。

>というか、その GetLastError って
>fopen でエラーが起こった直後で取得していますか

>fopen で NULL が返ってきたものを、他の関数に与えてエラー起こしてるのなら
>そりゃ「ハンドルが無効です」で合ってるのではないですか

いえ。
fopenの直後です。
(下記のように)

sprintf(fn, V%02d%02d.wav, (HMOD-1), HnC);
if ((fp = fopen(fn, rb)) == NULL)
{
   n = GetLastError(); /* Return Error Code */

}

私自身、こんなのはすぐ解決の付く問題だと思っていましたが、
、、、
すみません。


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

こっちの方は?
OutputDebugString( _sys_errlist[ errno ] );


返信引用
たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

だから、、、

私があなたのことを日本語どうこうといったのは

・みなさんから頂いたヒント、アドバイスを実行していない、理解していない

・特にPAIさんとREEさんの

>該当ファイル名のファイルを
>開いて即閉じるだけのプログラムを作って実行させたらどうなりますか?

>ソースの肝心のところが提示されていないように感じます。
>少なくとも今回の場合には、ファイルのopenとcloseの個所が分かるようにすべきです。

>提示する時には、まず、コピーペーストして、
>その後に“明らかに余分なところ”だけを編集しましょう。

これをなぜ実行しようとしないのですか?


返信引用
ふじ
 ふじ
(@ふじ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

HMOD=1→100、HnC=0→20でネストしていて、
HMOD=11,HnC=7以降のfopenで
if ((fp = fopen(fn, rb)) == NULL)
でfpがNULLになり、
このエラーが出ているので、

こう言う分析コードにしてみました。
ただ、これ以上はわからない。
(実際、開こうとするファイルはどう見たって
 実在するし、fopenとfcloseの数も
 oPenCounterを見てる限りは、
 正常にオープン出来る時も出来ない時も
 fopen前には、0になっていて噛みあっているのです)

時々は、コードの各箇所でgoto文を使ったりしているのですが、
あんまり、これも悪さしているとも思えないし。

今わかっていることと言えば、
このエラーの起こっている箇所でfopenすれば
'ハンドルが無効です' が返って来る 。
そう言うことです。
これから先、分析できること、思い当たることと言えば
何でしょうか?
結構変数をたくさん頭で切っているので、
要らないものを屁減らし、これらを小さくして
行くことでしょうか?

====================================

long openCounter = 0; /* fopen数 - fclose数 */
#define fopen(fname, mode) (++openCounter, (fopen)(fname, mode))
#define fclose(fp) (--openCounter, (fclose)(fp))

/* :::::::::::::::::::::::: */
/* :::::::::::::::::::::::: */

for (HMOD=1;HMOD<100;HMOD++)
for (HnC=0;HnC<20;HnC++)
{
/* :::::::::::::::::::::::: */
/* :::::::::::::::::::::::: */ /* こう言った所で 時々goto文を使っているから */
/* :::::::::::::::::::::::: */ /* こう言うことが起きるのかな? */

sprintf(fn, V%02d%02d.wav, (HMOD-1), HnC);

if (HMOD != 11 || HnC != 7)
{
fopen(fn, rb); /* Normal */

FormatMessage( 0x1000, 0, GetLastError(), 0x400, buf, 512-1, 0 );
OutputDebugString( buf );
printf(\n);        /* ここは'正常終了しました' が返って来る */
}
else
{
fopen(fn, rb); /* Abnormal */

FormatMessage( 0x1000, 0, GetLastError(), 0x400, buf, 512-1, 0 );
OutputDebugString( buf );
printf(\n); /* ここは'ハンドルが無効です' が返って来る */
}
:::::::::::::::: /* ここでfgetしようがしまいが現象は同じ */

fclose(fp);
}


返信引用
たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

fp にファイルポインタいれてないのにどうやってファイル操作してるの?

>ソースの肝心のところが提示されていないように感じます。
>少なくとも今回の場合には、ファイルのopenとcloseの個所が分かるようにすべきです。

>提示する時には、まず、コピーペーストして、
>その後に“明らかに余分なところ”だけを編集しましょう。

やっぱり日本語読めないのかなぁ。。。


返信引用
すがり
 すがり
(@すがり)
ゲスト
結合: 22年前
投稿: 6
 

今までの構図は、

ふじさんが発言する -> 皆さんがそれに'応答'する
…ここでコミュニケーションが途切れる…
再び、ふじさんがほぼ'新たな'発言をする -> 応答する
…途切れる

という非常に一方向の流れになっています。
お互いにフィードバックを掛けて、応答し合わなければ、一向に話は進まないでしょう。
(極論、お互いに相手の発言を引用し合っている流れこそ、応答し合う状態)
コミュニケーションとは双方向なものです。


返信引用
おためしさん
 おためしさん
(@おためしさん)
ゲスト
結合: 22年前
投稿: 2
 

試してみました。
ファイル名は固定にして数千回ループしてみましたが、
問題なさそうです。ただ、

> fopen(fn, rb);
のところは

if((fp=fopen(fn, rb))==NULL) {
だとして
if((fp=fopen(fn, rb))==NULL) {
// エラー表示
continue; // これ
}
では? エラーのときfcloseで例外おきません?

#なかなか進展しませんね。

新規プロジェクトを作ってみて以下は動きます?

long openCounter = 0; /* fopen数 - fclose数 */
#define fopen(fname, mode) (++openCounter, (fopen)(fname, mode))
#define fclose(fp) (--openCounter, (fclose)(fp))

int main(int argc, char* argv[])
{
int HMOD;
int HnC;
FILE *fp;
char fn[1000];

for (HMOD=1;HMOD<1000;HMOD++) {
for (HnC=0;HnC<20;HnC++) {

// ファイル名固定にしてみるとか「1107.wav」など
sprintf(fn, V%02d%02d.wav, (HMOD-1), HnC);

if (HMOD != 11 || HnC != 7) {
if((fp=fopen(fn, rb))==NULL) {
printf(Err\n);
continue;
}
} else {
if((fp=fopen(fn, rb))==NULL) {
printf(Err\n);
continue;
}
}
fclose(fp);
}
}
return 0;
}


返信引用
ふじ
 ふじ
(@ふじ)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

みなさん

いろいろありがとうございます。

>fopen(fn, rb);
>のところは

> if((fp=fopen(fn, rb))==NULL) {
>だとして
> if((fp=fopen(fn, rb))==NULL) {
> // エラー表示
> continue; // これ
> }
>では? エラーのときfcloseで例外おきません?

そうですね。

スルーでやっても、とりあえず
fcloseは通り抜けているようです。

ただ、一旦エラーが起きれば、もう
プロセスは止めるかすべきでしょうね。
(以降は、必ずfopenでエラーしているので)


返信引用
おためしさん
 おためしさん
(@おためしさん)
ゲスト
結合: 22年前
投稿: 2
 

むねんです。でも本筋はエラーの後の処理の事言っている
わけではないんです。

>// ファイル名固定にしてみるとか「1107.wav」など
はどうですか?

>新規プロジェクトを作ってみて以下は動きます?
はどうでした?

引用だけでなく試してみた結果をあげましょう。

両方ともできるのは確認してますけど、ふじさんの
ところではどうでしょうか?ということです。
10日も悩んでいるのであればこんなの試してみるのも
たいしたことないでしょう。

(おそらくほかの人もそう思っていると思いますけど)
やってないでしょ?ってことです。(できない?)

#なかなか進展しないので
#関数部分をアップするのが一番の早道かとおもいます。
#これだけの情報では、お手上げです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

...なんでこうも噛み合わないんだろ...

1. V1007.wav だけをオープンしてみる。OKか?
2. 全ファイルについてオープン/クローズしてみる。OKか?

上記2つ、まず試すべし。


返信引用
ひょっとして
 ひょっとして
(@ひょっとして)
ゲスト
結合: 22年前
投稿: 11
 

 話の本筋からはずれてしまいますが、やりとりをみていて感じたことなどを…。(^^;
ふじさんってひょっとして外国の方なのかな? 最近割と外国からいらっしゃった方と
一緒の職場で働く機会が増えてきたのですが、文章を読ませていただくと外国の方なの
かもと思われる節が見受けられます。(違ってたらごめんなさい)


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

...それで?


返信引用
ひょっとして
 ひょっとして
(@ひょっとして)
ゲスト
結合: 22年前
投稿: 11
 

> ...それで?

失礼しました。え~と結論はこうです。

 1)多少日本語の表現でわかりにくいところは目をつぶる(目くじらを立てない)
 2)一気にまくし立てても理解できないものは無視されるので、(だから質問に対
  して返事が出来ない)必要な事だけ短く強調して説明する。
 3)出来るだけ平易な言葉で説明する。
 4)どうしても実施してもらいたいもの(ソースが提示される等)が実施されるま
  で新たなアドバイスをしない。

…という感じでいかがでしょう?


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

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