//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
struct TestRecord {
long id;
char name[12];
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// fopen,fclose,fwrite,fread 等を使用
TestRecord WriteRec[4];
TestRecord ReadRec;
char *FName;
int cnt;
AnsiString msg;
FILE *sfs, *lfs;
// 初期化前のチェック sizeof( TestRecord ) = 16
msg = "sizeof( TestRecord ) = " + IntToStr( sizeof( TestRecord ) );
ShowMessage( msg );
// 初期化
FName = "FILETEST1.BIN";
Memo1->Clear();
for( cnt = 0; cnt <= 3; cnt ++ ){
memset( &WriteRec[ cnt ], 0, sizeof( TestRecord ) );
WriteRec[ cnt ].id = cnt + 1;
}
sprintf( WriteRec[0].name, "岡部" );
sprintf( WriteRec[1].name, "斎藤" );
sprintf( WriteRec[2].name, "原田" );
sprintf( WriteRec[3].name, "船木" );
msg = "Button1:binary file fwrite/fread Sample\xd\xa\xd\xa";
// バイナリファイル書き込み
sfs = fopen( FName, "wb" );
if( sfs == (FILE *)0 ){
ShowMessage( "書き込み時のopen失敗" );
return; // オープン失敗
}
for( cnt = 0; cnt <= 3; cnt ++ )
fwrite( &WriteRec[ cnt ], 1, sizeof( TestRecord ), sfs );
fclose( sfs );
// バイナリファイル読み込み
lfs = fopen( FName, "rb" );
if( lfs == (FILE *)0 ){
ShowMessage( "読み込み時のopen失敗" );
return; // オープン失敗
}
while( feof( lfs ) == 0 ){ // 終端に達するまでループ
memset( &ReadRec, 0, sizeof( TestRecord ) );
if( fread( &ReadRec, 1, sizeof( TestRecord ), lfs ) != sizeof( TestRecord ) )
break;
msg = msg + IntToStr( ReadRec.id ) + ",";
msg = msg + ReadRec.name + "\xd\xa";
}
fclose( lfs );
// ダンプ作成
// (Memo1のフォントを”MS ゴシック 10ポイント”にしておくこと)
FileDump( FName, msg );
// 結果表示
Memo1->Text = msg;
ShowMessage( "バイナリSave/Load完了" );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// TFileStream(VCL)の使用例
TestRecord WriteRec[4];
TestRecord ReadRec;
char *FName;
int cnt;
AnsiString msg;
TFileStream *sfs, *lfs;
// 初期化
FName = "FILETEST2.BIN";
Memo1->Clear();
for( cnt = 0; cnt <= 3; cnt ++ ){
memset( &WriteRec[ cnt ], 0, sizeof( TestRecord ) );
WriteRec[ cnt ].id = cnt + 1;
}
sprintf( WriteRec[0].name, "岡部" );
sprintf( WriteRec[1].name, "斎藤" );
sprintf( WriteRec[2].name, "原田" );
sprintf( WriteRec[3].name, "船木" );
msg = "Button2:binary file TFileStream(VCL) Sample\xd\xa\xd\xa";
// バイナリファイル書き込み
sfs = new TFileStream( FName, fmCreate );
for( cnt = 0; cnt <= 3; cnt ++ )
sfs->Write( &WriteRec[ cnt ], sizeof( TestRecord ) );
delete sfs;
// バイナリファイル読み込み
lfs = new TFileStream( FName, fmOpenRead );
while( 1 ){ // 無限ループ
memset( &ReadRec, 0, sizeof( TestRecord ) );
if( lfs->Read( &ReadRec, sizeof( TestRecord ) ) != (long)sizeof( TestRecord ) )
break;
msg = msg + IntToStr( ReadRec.id ) + ",";
msg = msg + ReadRec.name + "\xd\xa";
}
delete lfs;
// ダンプ作成
// (Memo1のフォントを”MS ゴシック 10ポイント”にしておくこと)
FileDump( FName, msg );
// 結果表示
Memo1->Text = msg;
ShowMessage( "バイナリSave/Load完了" );
}
//---------------------------------------------------------------------------
// FileDump()
// 指定ファイルのダンプイメージ文字列を作成します
// [in]
// FName : ダンプイメージするファイル名
// msg : ダンプイメージをセットする文字列変数(AnsiString のみ)
// [out]
// なし(ダンプイメージは msg にセットする)
// [注意]
// 関数内でファイルをオープンします。目的のファイルはファイルクローズ
// した状態で呼び出してください。
// msg は初期化しません。呼び出し側で初期化するようにしてください。
//
void TForm1::FileDump( const AnsiString& FName, AnsiString& msg )
{
int cnt;
unsigned char dat;
FILE *fs;
msg = msg + "\xd\xa\xd\xa";
msg = msg + "ADDR : 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\xd\xa";
msg = msg + "-----:-------------------------------------------------\xd\xa";
// バイナリファイル読み込み
fs = fopen( FName.c_str(), "rb" );
if( fs == (FILE *)0 ){
ShowMessage( "FileDump()でopen失敗" );
return; // オープン失敗
}
cnt = 0;
while( feof( fs ) == 0 ){ // 終端に達するまでループ
if( fread( &dat, 1, 1, fs ) != 1 )
break;
if( cnt % 16 == 0 )
// アドレス(16バイト毎)のセット
msg = msg + IntToHex( cnt, 4 ) + " : ";
cnt += 1;
msg = msg + IntToHex( dat, 2 );
if( cnt % 16 == 0 ){
// 16バイト毎に改行
msg = msg + "\xd\xa";
}
else{
if( cnt % 8 == 0 )
// 8バイトの所はスペースを2個入れる
msg = msg + " ";
else
msg = msg + " ";
}
}
fclose( fs );
msg = msg + "\xd\xa";
}
//---------------------------------------------------------------------------
|