none
C++でMDIを用いて選択されたファイルを変換した結果を表示したい RRS feed

  • 質問

  • VS2010 C++でMDIを用いて選択されたファイルを変換した結果を表示したい

    ・ファイルを開くで開いたファイルを変換後のファイルを表示しもとのファイルは変更しない。

    ・変換後のファイルは一時ファイルとして作成してもよいのですが。(閉じた時に削除する)

    初心者なのでこのへんがよくわかりませんでした。

    宜しくお願いいたします

     

    2010年10月31日 5:10

回答

  • こんにちわ。

    ファイルを開いて読み込んでいるだけであれば、元のファイルは何の変化もしないと思いますが、そういう話ではないのでしょうか?

    変換元ファイルを開き、データを変換後、変換先ファイルへ書き込めばいい様に思いますが・・・。

    • 回答としてマーク toshi-su 2010年11月5日 3:56
    2010年10月31日 9:32
  • >変換後のファイルは一時ファイルとして作成

    よくある手として、以下のような手段があります。

     

    1.変換後のDataを保存するTemporary Fileを作成し、Temporary Fileを開く

      Temporary Fileを作成する手段はCRTを使う方法とAPIを使う方法があり、どちらを利用してもよいです。

      ここではAPIを利用します。

      Temporary FileのPathは後で必要なくなったときに削除するため、保存しておきましょう。

     

      [Creating and Using a Temporary File]

        http://msdn.microsoft.com/en-us/library/aa363875(VS.85).aspx

        Sample Codeが参考になります。

     

      [CreateFile Function]

        http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

     

    2.CreateFile APIを利用して変換元のFileをRead Onlyで開く

    3.Dataを読み込み変換し、Temporary Fileに書き込む

      File Sizeが大きい場合はDataを一度に読み込むのではなく、数MBずつ読み込んで変換し書き込むという処理を繰り返しましょう。

     

      [ReadFile Function]

        http://msdn.microsoft.com/en-us/library/aa365467(VS.85).aspx

     

      [WriteFile Function]

        http://msdn.microsoft.com/en-us/library/aa365747(v=VS.85).aspx

     

    4.変換元のFileを閉じる

      [CloseHandle Function]

        http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx

     

    5.Temporary Fileが必要なくなったら、Fileを閉じて削除する

      [DeleteFile Function]

        http://msdn.microsoft.com/en-us/library/aa363915(v=VS.85).aspx

        FILE_FLAG_DELETE_ON_CLOSEを利用する手もありますが、ここで省きます。

     

    CRTを利用する場合は、以下を参考にしてください。 

      [tmpfile_s]

        http://msdn.microsoft.com/en-us/library/b3dz6009.aspx

     

    MFCならCFile Classが利用できますね。

     

     Temporary Fileを利用しない、つまり変換後のData Sizeが大きくない場合は、HeapAlloc/VirtualAllocでBufferを確保して、そこに直接変換後のDataを書き込んでいく方法もあります。

    • 回答としてマーク toshi-su 2010年11月5日 3:57
    2010年10月31日 11:29
  • 何から書いたら良いのかな。

    MDIを使ってると言う事はMFCアプリケーションですよね。
    質問する場合にプロジェクトを作成した時の種類を添えておくと話が早いので覚えておいた方が良いです。

    まず、やりたい事はMDIじゃないと出来ませんか?
    MDIはDoc-Viewが複数出てくるので初心者向けではないかなあと思います。
    SDIでも良いのであれば、まずはSDIの方が考えやすいです。
    更に言うとMDIやSDIをきちんと制御する為にはDocument View アーキテクチャを理解する必要があります。

    これは、何かのデータファイルを扱うようなプログラムを組む場合に必要になるであろう機能を
    雛形として用意してあって、それを使う事でどのアプリでも行うような同じ処理の部分を肩代りしてくれる
    と言うものです。これを使うといろいろと楽が出来ますが、逆を言うとそのフレームワークの既定の動きとは
    違う動作にしたい場合、フレームワークの仕組みを理解した上で手を加える必要がある為、少々ハードルが
    高くなります。それを承知の上でやっている、もしくはDocument View アーキテクチャの勉強をするので
    あれば、SDI、MDIを使うのは目的に適っていますが、単純にファイル変換のプログラムを作る事が目的で
    Document Viewを使う必要性がないならダイアログベースの方がDocument Viewに縛られない分だけ
    自由にプログラムが組めます。逆を言うならフレームワークがない分だけ自分でプログラミングを行なう量が
    増えると言う話ですね。

    で、Document View アーキテクチャを使うと言う事は、この仕組みの基本的な動きを抑えておく必要があります。
    既に書いていますが、Document View アーキテクチャを勉強する必要性が無くて、プログラムの仕様上も
    Document View アーキテクチャである必要がないなら別の手段(ダイアログベース)を使うのも手です。
    使う必要があるのであれば、まずはDocument View アーキテクチャの勉強をしてください。

    Document View アーキテクチャを使うと対象ファイルの選択や保存時のファイル選択処理等々、
    あらかた必要そうな処理は既に入った状態になります。とても便利なのですが、この定型の動きとは
    違った動きを実現しようとすると途端にフレームワークの部分が足枷になります。
    理想を言うならフレームワークの仕組みと動作を把握した上で、フレームワークの動きと矛盾しないように
    独自の動作を追加するという事が必要になります。

    現状で何処まで勉強するのかと言う部分もふまえて進め方を考えて見てはいかがでしょうか。

     


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク toshi-su 2010年11月5日 3:58
    2010年11月3日 1:32

すべての返信

  • こんにちわ。

    ファイルを開いて読み込んでいるだけであれば、元のファイルは何の変化もしないと思いますが、そういう話ではないのでしょうか?

    変換元ファイルを開き、データを変換後、変換先ファイルへ書き込めばいい様に思いますが・・・。

    • 回答としてマーク toshi-su 2010年11月5日 3:56
    2010年10月31日 9:32
  • >変換後のファイルは一時ファイルとして作成

    よくある手として、以下のような手段があります。

     

    1.変換後のDataを保存するTemporary Fileを作成し、Temporary Fileを開く

      Temporary Fileを作成する手段はCRTを使う方法とAPIを使う方法があり、どちらを利用してもよいです。

      ここではAPIを利用します。

      Temporary FileのPathは後で必要なくなったときに削除するため、保存しておきましょう。

     

      [Creating and Using a Temporary File]

        http://msdn.microsoft.com/en-us/library/aa363875(VS.85).aspx

        Sample Codeが参考になります。

     

      [CreateFile Function]

        http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

     

    2.CreateFile APIを利用して変換元のFileをRead Onlyで開く

    3.Dataを読み込み変換し、Temporary Fileに書き込む

      File Sizeが大きい場合はDataを一度に読み込むのではなく、数MBずつ読み込んで変換し書き込むという処理を繰り返しましょう。

     

      [ReadFile Function]

        http://msdn.microsoft.com/en-us/library/aa365467(VS.85).aspx

     

      [WriteFile Function]

        http://msdn.microsoft.com/en-us/library/aa365747(v=VS.85).aspx

     

    4.変換元のFileを閉じる

      [CloseHandle Function]

        http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx

     

    5.Temporary Fileが必要なくなったら、Fileを閉じて削除する

      [DeleteFile Function]

        http://msdn.microsoft.com/en-us/library/aa363915(v=VS.85).aspx

        FILE_FLAG_DELETE_ON_CLOSEを利用する手もありますが、ここで省きます。

     

    CRTを利用する場合は、以下を参考にしてください。 

      [tmpfile_s]

        http://msdn.microsoft.com/en-us/library/b3dz6009.aspx

     

    MFCならCFile Classが利用できますね。

     

     Temporary Fileを利用しない、つまり変換後のData Sizeが大きくない場合は、HeapAlloc/VirtualAllocでBufferを確保して、そこに直接変換後のDataを書き込んでいく方法もあります。

    • 回答としてマーク toshi-su 2010年11月5日 3:57
    2010年10月31日 11:29
  • 何から書いたら良いのかな。

    MDIを使ってると言う事はMFCアプリケーションですよね。
    質問する場合にプロジェクトを作成した時の種類を添えておくと話が早いので覚えておいた方が良いです。

    まず、やりたい事はMDIじゃないと出来ませんか?
    MDIはDoc-Viewが複数出てくるので初心者向けではないかなあと思います。
    SDIでも良いのであれば、まずはSDIの方が考えやすいです。
    更に言うとMDIやSDIをきちんと制御する為にはDocument View アーキテクチャを理解する必要があります。

    これは、何かのデータファイルを扱うようなプログラムを組む場合に必要になるであろう機能を
    雛形として用意してあって、それを使う事でどのアプリでも行うような同じ処理の部分を肩代りしてくれる
    と言うものです。これを使うといろいろと楽が出来ますが、逆を言うとそのフレームワークの既定の動きとは
    違う動作にしたい場合、フレームワークの仕組みを理解した上で手を加える必要がある為、少々ハードルが
    高くなります。それを承知の上でやっている、もしくはDocument View アーキテクチャの勉強をするので
    あれば、SDI、MDIを使うのは目的に適っていますが、単純にファイル変換のプログラムを作る事が目的で
    Document Viewを使う必要性がないならダイアログベースの方がDocument Viewに縛られない分だけ
    自由にプログラムが組めます。逆を言うならフレームワークがない分だけ自分でプログラミングを行なう量が
    増えると言う話ですね。

    で、Document View アーキテクチャを使うと言う事は、この仕組みの基本的な動きを抑えておく必要があります。
    既に書いていますが、Document View アーキテクチャを勉強する必要性が無くて、プログラムの仕様上も
    Document View アーキテクチャである必要がないなら別の手段(ダイアログベース)を使うのも手です。
    使う必要があるのであれば、まずはDocument View アーキテクチャの勉強をしてください。

    Document View アーキテクチャを使うと対象ファイルの選択や保存時のファイル選択処理等々、
    あらかた必要そうな処理は既に入った状態になります。とても便利なのですが、この定型の動きとは
    違った動きを実現しようとすると途端にフレームワークの部分が足枷になります。
    理想を言うならフレームワークの仕組みと動作を把握した上で、フレームワークの動きと矛盾しないように
    独自の動作を追加するという事が必要になります。

    現状で何処まで勉強するのかと言う部分もふまえて進め方を考えて見てはいかがでしょうか。

     


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク toshi-su 2010年11月5日 3:58
    2010年11月3日 1:32
  • こんにちは。

    回答ありがとうございました、もうすごし勉強してみます、フレームワークですね。

     

    2010年11月5日 4:03
  • こんにちは

    ご回答ありがとうございました。

    CFILEのクラスを使用する方向で考えております。

    2010年11月5日 4:05
  • こんにちは

    ご回答ありがとうございました。

    変換は、ファイル開くと同時に行いたいと考えております。

    1アクションで変換後のファイルが表示されるようにしたい方向で考えております。

    ありがとうございました。

     

    2010年11月5日 4:08