というか、その GetLastError って
fopen でエラーが起こった直後で取得していますか
fopen で NULL が返ってきたものを、他の関数に与えてエラー起こしてるのなら
そりゃ「ハンドルが無効です」で合ってるのではないですか
これだけ単純なことに関して、これだけみなさんからヒント頂いて
何もまともにやっていないように思われるのは。。。
答えるの無駄かなぁって思っちゃいます
日本語を書くのも読むのもだめな人なのかなぁ。。。
> 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()の直後に置く。
皆さんからのご指摘りがとうございます。
テキストそのものがコードの中で現れるように
実装します。
>というか、その 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 */
}
私自身、こんなのはすぐ解決の付く問題だと思っていましたが、
、、、
すみません。
こっちの方は?
OutputDebugString( _sys_errlist[ errno ] );
だから、、、
私があなたのことを日本語どうこうといったのは
・みなさんから頂いたヒント、アドバイスを実行していない、理解していない
・特にPAIさんとREEさんの
>該当ファイル名のファイルを
>開いて即閉じるだけのプログラムを作って実行させたらどうなりますか?
>ソースの肝心のところが提示されていないように感じます。
>少なくとも今回の場合には、ファイルのopenとcloseの個所が分かるようにすべきです。
>提示する時には、まず、コピーペーストして、
>その後に“明らかに余分なところ”だけを編集しましょう。
これをなぜ実行しようとしないのですか?
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);
}
fp にファイルポインタいれてないのにどうやってファイル操作してるの?
>ソースの肝心のところが提示されていないように感じます。
>少なくとも今回の場合には、ファイルのopenとcloseの個所が分かるようにすべきです。
>提示する時には、まず、コピーペーストして、
>その後に“明らかに余分なところ”だけを編集しましょう。
やっぱり日本語読めないのかなぁ。。。
今までの構図は、
ふじさんが発言する -> 皆さんがそれに'応答'する
…ここでコミュニケーションが途切れる…
再び、ふじさんがほぼ'新たな'発言をする -> 応答する
…途切れる
という非常に一方向の流れになっています。
お互いにフィードバックを掛けて、応答し合わなければ、一向に話は進まないでしょう。
(極論、お互いに相手の発言を引用し合っている流れこそ、応答し合う状態)
コミュニケーションとは双方向なものです。
試してみました。
ファイル名は固定にして数千回ループしてみましたが、
問題なさそうです。ただ、
> 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;
}
みなさん
いろいろありがとうございます。
>fopen(fn, rb);
>のところは
>
> if((fp=fopen(fn, rb))==NULL) {
>だとして
> if((fp=fopen(fn, rb))==NULL) {
> // エラー表示
> continue; // これ
> }
>では? エラーのときfcloseで例外おきません?
そうですね。
スルーでやっても、とりあえず
fcloseは通り抜けているようです。
ただ、一旦エラーが起きれば、もう
プロセスは止めるかすべきでしょうね。
(以降は、必ずfopenでエラーしているので)
むねんです。でも本筋はエラーの後の処理の事言っている
わけではないんです。
>// ファイル名固定にしてみるとか「1107.wav」など
はどうですか?
>新規プロジェクトを作ってみて以下は動きます?
はどうでした?
引用だけでなく試してみた結果をあげましょう。
両方ともできるのは確認してますけど、ふじさんの
ところではどうでしょうか?ということです。
10日も悩んでいるのであればこんなの試してみるのも
たいしたことないでしょう。
(おそらくほかの人もそう思っていると思いますけど)
やってないでしょ?ってことです。(できない?)
#なかなか進展しないので
#関数部分をアップするのが一番の早道かとおもいます。
#これだけの情報では、お手上げです。
...なんでこうも噛み合わないんだろ...
1. V1007.wav だけをオープンしてみる。OKか?
2. 全ファイルについてオープン/クローズしてみる。OKか?
上記2つ、まず試すべし。
話の本筋からはずれてしまいますが、やりとりをみていて感じたことなどを…。(^^;
ふじさんってひょっとして外国の方なのかな? 最近割と外国からいらっしゃった方と
一緒の職場で働く機会が増えてきたのですが、文章を読ませていただくと外国の方なの
かもと思われる節が見受けられます。(違ってたらごめんなさい)
...それで?
> ...それで?
失礼しました。え~と結論はこうです。
1)多少日本語の表現でわかりにくいところは目をつぶる(目くじらを立てない)
2)一気にまくし立てても理解できないものは無視されるので、(だから質問に対
して返事が出来ない)必要な事だけ短く強調して説明する。
3)出来るだけ平易な言葉で説明する。
4)どうしても実施してもらいたいもの(ソースが提示される等)が実施されるま
で新たなアドバイスをしない。
…という感じでいかがでしょう?