ページ 11

なぜエラーなのか。

Posted: 2012年6月24日(日) 17:19
by helloworld1853
あるプログラムを作っているのですが、

fwriteで致命的なエラーが起きます。

そのプログラムはあまりにも長く解読が困難なので、

大幅に省略しました。

なぜ動作しないのでしょうか。

回答お願いします。

コード:

#include<stdio.h>
#include<string.h>
FILE *fp_exe;
char body_buff_exe[] = "MZ";
int Mysearch_exe()
{
	fwrite( body_buff_exe, sizeof( char ), strlen( body_buff_exe ), fp_exe );
	fclose(fp_exe);
	return 0;
}
int main()
{
	char exe_filename[] = "C://test.exe";
	char *fname_exe;
	fname_exe = exe_filename;
	fp_exe = fopen( fname_exe,"wb" );
	if( fp_exe == NULL )
	{
		puts("fopen失敗");
		return -1;
	}
	Mysearch_exe();
	return 0;
}

Re: なぜエラーなのか。

Posted: 2012年6月24日(日) 17:38
by softya(ソフト屋)
確か前々から注意しているはずですがバイナリデータで文字列関数のstrlenを使うのは止めて下さい。
0x00=ナル文字を見つけるまでの長さがstrlenですのでバッファが0x00以外で埋まっていたら何処まで検索に行くか保証ができません。
あとバイナリデータ中に0x00があればそこで停止します。

で、どんなエラーが出るんでしょうか? fopenに失敗するなら分かるんですが。
それとCドライブ直下にファイル書くのはWindws7/Vistaが制限していはず・・・。

Re: なぜエラーなのか。

Posted: 2012年6月24日(日) 20:20
by helloworld1853
>それとCドライブ直下にファイル書くのはWindws7/Vistaが制限していはず・・・。

これが原因だったようです。

制限されていたのでfopenが失敗し、

fwriteが失敗したという感じでした。

>確か前々から注意しているはずですがバイナリデータで文字列関数のstrlenを使うのは止めて下さい。

そうでしたね。今回の場合はsizeofでした。

どうしてもstrlenを使う癖があったので注意します。

回答してくださってありがとうございます。

Re: なぜエラーなのか。

Posted: 2012年6月24日(日) 21:52
by softya(ソフト屋)
あと
C://test.exe
じゃなく
C:/test.exe
だと思います。
://はURLの書き方でファイルパスでは使いません。

Re: なぜエラーなのか。

Posted: 2012年6月24日(日) 21:54
by みけCAT
softya(ソフト屋) さんが書きました:あと
C://test.exe
じゃなく
C:/test.exe
だと思います。
://はURLの書き方でファイルパスでは使いません。
C:\\test.exe
(エスケープシーケンス)と混ざっているのでしょうか?

Re: なぜエラーなのか。

Posted: 2012年6月24日(日) 21:56
by softya(ソフト屋)
みけCAT さんが書きました:
softya(ソフト屋) さんが書きました:あと
C://test.exe
じゃなく
C:/test.exe
だと思います。
://はURLの書き方でファイルパスでは使いません。
C:\\test.exe
(エスケープシーケンス)と混ざっているのでしょうか?
ああ、なるほど。そういう事でしょうか?