ページ 11

アーカイブファイルについて

Posted: 2010年5月01日(土) 22:17
by たろう
アーカイブファイルを作っています。
それでわからなくなったんで質問させていただきます。
下記のようにプログラムを組んだのですが、
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:アーカイブファイルについて

Posted: 2010年5月02日(日) 01:43
by Justy
 _tcscpy_sの第二引数は要素の数を指定するもので、バイトサイズじゃないです。

Re:アーカイブファイルについて

Posted: 2010年5月02日(日) 12:01
by たろう
回答ありがとうございます。
>_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( &copy_byte, 1, 1, read_file );
            fwrite( &copy_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:アーカイブファイルについて

Posted: 2010年5月03日(月) 01:53
by Justy
>何を指定すればよいのでしょうか
 第一引数で指定したバッファの要素数です。
 つまり、 NAME_MAX * sizeof( TCHAR )じゃなくて、NAME_MAXです。