はじめてのDelphi(その6−1)

戻る

ここでは、VBC++BuilderDelphiVCのテキストファイルの書き込み/読み込みの違いを見てみます。C++Builder と Delphi はメモコンポーネントで直接ファイルに書き込み/読み込みができます。

テキストファイル

  • ファイルに”ABCあいう”、”DEFえおか”、”GHIきくけ”の3行を書き込みします。
  • 書き込みしたファイルを読み出し、テキストボックス(VB)/メモ(C++Builder/Delphi)/エディットボックス(VC)にセットします。

 


VBの場合

  • フォームにテキストボックス(Text1)を置いてください。
    MultiLine プロパティTrue にしておきます。
  • Line Input # ステートメントは改行コード(CR,LF)を読み込まないので、 vbCrLf を追加しています。

先頭へ


Private Sub Command1_Click()
    Dim FName As String     ' ファイル名
    Dim LoadLine As String  ' 1行読み込み
    Dim LoadText As String  ' 読み込みバッファ
    
    '* 初期化
    FName = "FILETEST.TXT"
    LoadText = ""
    Text1.Text = ""
    
    '* テキストファイル書き込み
    Open FName For Output As #1    ' ファイルを開きます。
    Print #1, "ABCあいう"           ' 書き込みます。
    Print #1, "DEFえおか"
    Print #1, "GHIきくけ"
    Close #1                        ' ファイルを閉じます。
    
    '* テキストファイル読み込み
    Open FName For Input As #1              ' ファイルを開きます。
    Do While Not EOF(1)                     ' ファイルの終端までループを繰り返します。
        Line Input #1, LoadLine             ' 行を変数に読み込みます。
        LoadText = LoadText + LoadLine + vbCrLf
    Loop
    Close #1                                ' ファイルを閉じます。
    
    '* 読み込み結果表示
    Text1.Text = LoadText
    Call MsgBox("Save/Load完了")
    
End Sub


C++Builderの場合

  • フォームにメモコンポーネント(Memo1)を置いてください。
  • ボタン1は C 標準ライブラリによる1行づつの書き込み/読み込みです。
    fgets() は改行コード(CR,LF)を LF に変換するため、メモコンポーネントに代入する前に LF→CR,LF 変換が必要です。
  • ボタン2は TStringList を利用した例です。
    Delphi と記述が異なるので注意が必要です。
  • ボタン3は TMemo を利用した例です。

先頭へ


//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// fopen,fclose,fprintf,fgets 等を使用
    char  *FName;
    char  LoadLine[128];
    AnsiString   LoadText;
    int   len;
    FILE  *sfs, *lfs;

    // 初期化
    FName = "FILETEST1.TXT";
    Memo1->Clear();
    LoadText = "";

    // テキストファイル書き込み
    sfs = fopen( FName, "wt" );
    if( sfs == (FILE *)0 ){
        ShowMessage( "書き込み時のopen失敗" );
        return;    // オープン失敗
    }
    fprintf( sfs, "ABCあいう\n" );
    fprintf( sfs, "DEFえおか\n" );
    fprintf( sfs, "GHIきくけ\n" );
    fclose( sfs );

    // テキストファイル読み込み
    lfs = fopen( FName, "rt" );
    if( lfs == (FILE *)0 ){
        ShowMessage( "読み込み時のopen失敗" );
        return;    // オープン失敗
    }
    while( feof( lfs ) == 0 ){  // 終端に達するまでループ
        memset( LoadLine, 0, sizeof( LoadLine ) );
        fgets( LoadLine, 127, lfs );
        len = strlen( LoadLine );
        if( len > 0 ){
             if( LoadLine[ len - 1 ] == '\xa' ){
                 // LF を CR,LF に変換
                 LoadLine[ len - 1 ] = '\xd';
                 LoadLine[ len - 0 ] = '\xa';
             }
             LoadText += LoadLine;
        }
    }
    fclose( lfs );

    // 結果表示
    Memo1->Text = LoadText;
    ShowMessage( "Save/Load完了" );

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// TStringList(VCL)の使用例、簡潔に書けます(^^;
    AnsiString   FName;
    TStringList  *SaveText, *LoadText;

    // 初期化
    FName = "FILETEST2.TXT";
    Memo1->Clear();

    // テキストファイル書き込み
    SaveText = new TStringList;      // オブジェクトの生成
    SaveText->Add( "ABCあいう" );    // 1行づつ文字列をセット
    SaveText->Add( "DEFえおか" );
    SaveText->Add( "GHIきくけ" );
    SaveText->SaveToFile( FName );   // TStringListの内容を全て書き込む
    delete SaveText;                 // オブジェクトの破棄

    // テキストファイル読み込み
    LoadText = new TStringList;        // オブジェクトの生成
    LoadText->LoadFromFile( FName );   // TStringListにファイルを全て読み込む
    Memo1->Text = LoadText->Text;      // Memo1に内容をコピー
    delete LoadText;                   // オブジェクトの破棄

    // 結果表示
    ShowMessage( "Save/Load完了" );

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
// TMemo(VCL)のみの使用例、さらに簡潔です(^^;;;
    AnsiString   FName;

    // 初期化
    FName = "FILETEST3.TXT";

    // テキストファイル書き込み
    Memo1->Clear();
    Memo1->Lines->Add( "ABCあいう" );    // 1行づつ文字列をセット
    Memo1->Lines->Add( "DEFえおか" );
    Memo1->Lines->Add( "GHIきくけ" );
    Memo1->Lines->SaveToFile( FName );   // Memo1の内容を全て書き込む

    // テキストファイル読み込み
    Memo1->Clear();
    Memo1->Lines->LoadFromFile( FName ); // ファイルを全てMemo1に読み込む

    // 結果表示
    ShowMessage( "Save/Load完了" );
}
//---------------------------------------------------------------------------

Delphiの場合

  • フォームにメモコンポーネント(Memo1)を置いてください。
  • ボタン1は PASCAL による1行づつの書き込み/読み込みです。
    Readln() は改行コード(CR,LF)を読み込まないので、 #13#10 を追加しています。
  • ボタン2は TStringList を利用した例です。
    C++Builder と記述が異なるので注意が必要です。
  • ボタン3は TMemo を利用した例です。

先頭へ


procedure TForm1.Button1Click(Sender: TObject);
var
  FName: String;
  LoadLine, LoadText: String;
  stf, ltf: TextFile;
begin
// AssignFile,Writeln,Readln

    // 初期化
    FName := 'FILETEST1.TXT';
    Memo1.Clear();
    LoadText := '';

    // テキストファイル書き込み
    AssignFile( stf, FName );
    Rewrite( stf );
    Writeln( stf, 'ABCあいう' );
    Writeln( stf, 'DEFえおか' );
    Writeln( stf, 'GHIきくけ' );
    CloseFile( stf );

    // テキストファイル読み込み
    AssignFile( ltf, FName );
    Reset( ltf );
    while not Eof( ltf ) do  // ファイルの終端までループ
    begin
        Readln( ltf, LoadLine );
        LoadText := LoadText + LoadLine + #13#10;
    end;
    CloseFile( ltf );

    // 結果表示
    Memo1.Text := LoadText;
    ShowMessage( 'Save/Load完了' );

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  SaveText, LoadText: TStringList;
  FName: String;
begin
// TStringList(VCL)の使用例、簡潔に書けます(^^;

    // 初期化
    FName := 'FILETEST2.TXT';
    Memo1.Clear();

    // テキストファイル書き込み
    SaveText := TStringList.Create;  // オブジェクトの生成
    SaveText.Add( 'ABCあいう' );     // 1行づつ文字列をセット
    SaveText.Add( 'DEFえおか' );
    SaveText.Add( 'GHIきくけ' );
    SaveText.SaveToFile( FName );    // TStringListの内容を全て書き込む
    SaveText.Free;                   // オブジェクトの破棄

    // テキストファイル読み込み
    LoadText := TStringList.Create;    // オブジェクトの生成
    LoadText.LoadFromFile( FName );    // TStringListにファイルを全て読み込む
    Memo1.Text := LoadText.Text;       // Memo1に内容をコピー
    LoadText.Free;                     // オブジェクトの破棄

    // 結果表示
    ShowMessage( 'Save/Load完了' );

end;

procedure TForm1.Button3Click(Sender: TObject);
var
  FName: String;
begin
// TMemo(VCL)のみの使用例、さらに簡潔です(^^;;;

    // 初期化
    FName := 'FILETEST3.TXT';

    // テキストファイル書き込み
    Memo1.Clear();
    Memo1.Lines.Add( 'ABCあいう' );    // 1行づつ文字列をセット
    Memo1.Lines.Add( 'DEFえおか' );
    Memo1.Lines.Add( 'GHIきくけ' );
    Memo1.Lines.SaveToFile( FName );   // Memo1の内容を全て書き込む

    // テキストファイル読み込み
    Memo1.Clear();
    Memo1.Lines.LoadFromFile( FName ); // ファイルを全てMemo1に読み込む

    // 結果表示
    ShowMessage( 'Save/Load完了' );

end;



VCの場合

 比較参考用です(^^; ダイアログベースのアプリケーションでテストしています。

  • ダイアログにボタン(IDC_BUTTON1)とエディットボックス(IDC_EDIT1)を置いてください。
  • エディットボックス(IDC_EDIT1)を右クリックし、[プロパティ|スタイル]で[複数行]にチェックを付けてください。
  • エディットボックス(IDC_EDIT1)を右クリックし、[ClassWizard|メンバ変数]でコントロールID[IDC_EDIT1]を選び[変数の追加(A)]を押してください。
    [カテゴリ(C)]が”値”、[変数のタイプ(T)]が”CString”であることを確認し、[メンバ変数(N)]に”m_Edit1”と入力します。
  • ボタン(IDC_BUTTON1)を右クリックし、[ClassWizard|メッセージマップ]でメッセージ[BN_CLICKED]を選び[関数の追加(A)]を押してください。追加する関数名を”OnButton1”にします。
  • ↑ああ、面倒だ(笑) 詳しくはVCのマニュアルまたは入門書を読んでください。
  • CStdioFile::ReadString() は改行コード(CR,LF)を読み込まないので、"\xd\xa" を追加しています。

先頭へ


// Button1クリック時のイベント処理
void CVC5Dlg::OnButton1() 
{
    // 初期化
    CString FName = "FILETEST.TXT";
    m_Edit1 = "";  // テキストボックスに関連付けしているメンバー変数
    UpdateData( FALSE );

    // テキストファイル書き込み
    CStdioFile *ssf = new CStdioFile( FName, CFile::modeCreate | CFile::modeWrite | CFile::typeText );
    ssf->WriteString( "ABCあいう\n" );
    ssf->WriteString( "DEFえおか\n" );
    ssf->WriteString( "GHIきくけ\n" );
    delete ssf;

    // テキストファイル読み込み
    CString LoadText = "";
    CString LoadLine;
    CStdioFile *lsf = new CStdioFile( FName, CFile::modeRead | CFile::typeText );
    while( lsf->ReadString( LoadLine ) != FALSE ){
        LoadText = LoadText + LoadLine + "\xd\xa";
    }
    delete lsf;

    // 読み込み結果表示
    m_Edit1 = LoadText;
    UpdateData( FALSE );
    AfxMessageBox( "Save/Load完了", MB_OK | MB_ICONINFORMATION );
}


 

先頭へ/戻る