アーカイブファイルを作っています。
それでわからなくなったんで質問させていただきます。
下記のようにプログラムを組んだのですが、
Run-Time Check Failure #2 - Stack around the variable 'save_name' was corrupted.
というエラーが出てきてしまい進展しません。
どうしたらエラーをなくして実行できるようになるのでしょうか?
//--------------------------------------------------------------
// アーカイブ
//--------------------------------------------------------------
bool Archive( TCHAR* DirName, TCHAR* SaveName )
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
// ファイル先頭からの位置
unsigned int file_point = sizeof(ArcData);
FILE* archive_file;
FILE* read_file;
// 検索するファイル名
TCHAR search_name[NAME_MAX];
TCHAR save_name[NAME_MAX];
TCHAR new_name[NAME_MAX];
TCHAR parts_name[NAME_MAX];
unsigned int copy_byte;
int loop;
unsigned int copy_loop;
// セーブするファイル名
_tcscpy_s( save_name, NAME_MAX * sizeof( TCHAR ), _T("out\\") );
_tcscat_s( save_name, NAME_MAX * sizeof( TCHAR ), SaveName );
_tcscat_s( save_name, NAME_MAX * sizeof( TCHAR ), _T(".dat") );
.
.
.
ソースが足りなければ補足します。
よろしくお願いします。
アーカイブファイルについて
-
たろう
Re:アーカイブファイルについて
回答ありがとうございます。
>_tcscpy_sの第二引数は要素の数を指定するもので、バイトサイズじゃないです。
何を指定すればよいのでしょうか?
あとこのソースの続きです。
>_tcscpy_sの第二引数は要素の数を指定するもので、バイトサイズじゃないです。
何を指定すればよいのでしょうか?
あとこのソースの続きです。
// 検索するファイル名を作成
// フォルダ内の全ファイルを指定する
_tcscpy_s( search_name, NAME_MAX * sizeof( char), DirName );
_tcscat_s( search_name, NAME_MAX * sizeof( char ), _T("*.*") );
// 最初の1行だけ実行
hFind = FindFirstFile( _T("out\\ARC_TEST.h"), &FindFileData );
if(hFind == INVALID_HANDLE_VALUE) {
printf( "!! ERROR !! no file" );
}
// 最初のファイルはディレクトリなのではずす
FindNextFile( hFind, &FindFileData );
bool max_over = false;
while( true ){
// ファイルを検索
if( FindNextFile( hFind, &FindFileData ) == 0 ){
// エラーチェック
if( GetLastError() == ERROR_NO_MORE_FILES ){
// ファイルがもうないなら終了
break;
} else {
// そうでなければエラーで戻る
FindClose(hFind);
return true;
}
}
if( g_arc_data.count < FILE_MAX ){
// ヘッダに情報を書き込む
g_arc_data.parts[ g_arc_data.count ].point = file_point;
g_arc_data.parts[ g_arc_data.count ].size = FindFileData.nFileSizeLow;
// ファイル名のコピー
_tcscpy_s( g_arc_data.parts[ g_arc_data.count ].name, NAME_MAX * sizeof( TCHAR ), FindFileData.cFileName );
// 格納するファイルの先頭からの位置計算
file_point += FindFileData.nFileSizeLow;
// ファイルの数をカウントする
g_arc_data.count++;
} else {
max_over = true;
g_arc_data.count++;
}
}
if( max_over ){
printf( "!! ERROR !! FILE_MAX over : %d > %d\n", g_arc_data.count, FILE_MAX );
return true;
}
// 検索終了
FindClose( hFind );
// バイナリ書き込みモードでまとめるファイルを開く
_tfopen_s( &archive_file, save_name, _T("w+b") );
// ヘッダ本体
fwrite( &g_arc_data, sizeof( ArcData ), 1, archive_file );
printf( "#ifndef __%s_H__\n", SaveName );
printf( "#define __%s_H__\n", SaveName );
printf( "\n\n" );
printf( "#define %s_MEMBER \\\n", SaveName );
for( loop = 0 ; loop < g_arc_data.count ; loop++ ){
// 個別のファイルを1つのファイルにコピーする
_tcscpy_s( new_name, NAME_MAX * sizeof( TCHAR ), DirName );
_tcscat_s( new_name, NAME_MAX * sizeof( TCHAR ), g_arc_data.parts[loop].name );
_tfopen_s( &read_file, new_name, _T("r+b") );
for( copy_loop = 0 ; copy_loop < g_arc_data.parts[loop].size ; copy_loop++ ){
// ファイルサイズ分だけ繰り返す
fread( ©_byte, 1, 1, read_file );
fwrite( ©_byte, 1, 1, archive_file );
}
printf( "\t%s", SaveName );
_tcscpy_s( parts_name, NAME_MAX * sizeof( TCHAR ), g_arc_data.parts[loop].name );
TCHAR* p_parts_name = &parts_name[0];
p_parts_name = StrToUpper( p_parts_name );
printf( "( %s, %d ) /* [%d] %s */ \\\n", parts_name, g_arc_data.parts[loop].size, loop, g_arc_data.parts[loop].name );
fclose( read_file );
}
printf( "\n" );
printf( "#undef %s\n", SaveName );
printf( "#define %s( _id, _size ) %s_ID_##_id, \n", SaveName, SaveName );
printf( "enum %s_ID\n{\n", SaveName );
printf( "\t %s_MEMBER\n", SaveName );
printf( "\t %s_ID_NUM\n", SaveName );
printf( "};\n\n" );
printf( "#endif\n", SaveName );
// ファイルを閉じる
fclose( archive_file );
// 正常終了
return false;
}-
Justy
Re:アーカイブファイルについて
>何を指定すればよいのでしょうか
第一引数で指定したバッファの要素数です。
つまり、 NAME_MAX * sizeof( TCHAR )じゃなくて、NAME_MAXです。
第一引数で指定したバッファの要素数です。
つまり、 NAME_MAX * sizeof( TCHAR )じゃなくて、NAME_MAXです。