アーカイブファイルを作っています。
それでわからなくなったんで質問させていただきます。
下記のようにプログラムを組んだのですが、
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; }
Re:アーカイブファイルについて
>何を指定すればよいのでしょうか
第一引数で指定したバッファの要素数です。
つまり、 NAME_MAX * sizeof( TCHAR )じゃなくて、NAME_MAXです。
第一引数で指定したバッファの要素数です。
つまり、 NAME_MAX * sizeof( TCHAR )じゃなくて、NAME_MAXです。