バイナリファイルとして開くには?

[戻る]
うにゃ [E-Mail] 2001/08/24(金) 01:58:36
Serialize関数を用いて(あらゆる拡張子の)ファイルをバイナリファイルとして開くにはどうしたらよいのでしょうか?(テキストファイルとしては読み込めました)

POSITION pos = GetFirstViewPosition();
CView* pEv = GetNextView(pos);
((CEditView*)pEv)->SerializeRaw(ar);

こんな感じ。

また、ダイアログを使って…

CFileDialog( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL).DoModal();
CString GetPathName(YomiFile1);
CFile( YomiFile1, CFile::modeRead | CFile::typeBinary);

こうやって、開いてみたけど「無効なファイル名です」なんて…
どなたか教えてください、お願いします。

Bun 2001/08/24(金) 23:44:45
> CFileDialog( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL).DoModal();
> CString GetPathName(YomiFile1);
> CFile( YomiFile1, CFile::modeRead | CFile::typeBinary);
> こうやって、開いてみたけど「無効なファイル名です」なんて…

普通は

CFile file;
CFileDialog dlg(TRUE ・・・);
if (dlg.DoModal()!= IDOK) return;
CString filename = GetPathName();
if (!file.Open(filename, CFile::modeREad | CFile::typeBinary)) return;

みたいに進みませんか?

Serializeは必要なのでしょうか?
(私は、使わないので、良くわかりませんけど・・・)

うにゃ 2001/08/25(土) 23:31:11
レスありがとうございます。
ソースを参考に自分がわかりやすいように、組みなおしました。

CString FileName1;
CFile fd;
CFileDialog dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL);
if ( dlg.DoModal() == IDOK)
{
    FileName1 = dlg.GetPathName();
    fd.Open( FileName1, CFile::modeRead | CFile::typeBinary);
}

エラーなく読み込めたようです。
これを表示するには、どうしたらよいでしょうか?
SDIアプリです。

CArchivcを使ってシリアル化して ->UpdateWindow() ?
それとも、1文字ずつ文字列に読み込んでいって ->TextOut() ?

たとえば…
int box;
while ( (box = fgetc(fd)) ! = EOF)
{

うにゃ 2001/08/26(日) 00:58:06
途中で送信してしまいました…続きです。

CArchivcを使ってシリアル化して ->UpdateWindow() ?
シシアル化で…

CString FileName1;
CFile fd;
CFileDialog dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL);
if ( dlg.DoModal() == IDOK)
{
    FileName1 = dlg.GetPathName();
    fd.Open( FileName1, CFile::modeRead | CFile::typeBinary);
    extern CArchive ar;
    fp = ar.GetFile();
    CObject* ReadObject( const CRuntimeClass* ar);
    Serialize( ar) -> UpdateWindow();
    
}

ウインドウへ表示させるために、こんな風に組み立てましたが…エラーでした。

error C2227: '->UpdateWindow' : 左側がクラス、構造体、共用体へのポインタではありません。

あともう少しでウインドウに表示できそうな気がするのですが…
ここら変は「VC++ML(Programming with VC++)」の過去ログにも乗っていませんでした。
もう一度、ご指導お願いします。

UpdateWindow のヘルプを見ると UpdateWindow(ウインドウのハンドル)
ってなっています。
ウインドウのハンドルを取得するために、
CWnd::CetActiveWindow
GetNextWindow
EnumWindows
で、取得できそうですが…ヘルプを見ると使えそうにないようです。
SDIアプリの場合、ウィンドウのハンドルってどうなるんですか?

Bun 2001/08/27(月) 08:06:34
ファイルをオープンするのであれば、シリアライズは不要だと思います。

それから、バイナリファイルとして開いて何をしたいのでしょうか?

UpdateWindow()は、MFCをお使いであれば

CWnd::UpdateWindow()という形で使えば良く、ハンドルは不要です。

GetSafeHwnd()で取得も可能ですけど・・・

CDC::TextOut()関数は文字列を出力しますので、文字列を準備しなければなりません。

文脈から、もう少し基礎的なところを学ばれたほうがよろしいかと・・・
(私もですけど・・・(^^; )

うにゃ 2001/08/31(金) 02:11:08
[[解決]]
>文脈から、もう少し基礎的なところを学ばれたほうがよろしいかと・・・

自分でも重々承知しています。
勉強のために組み立ててたんです。

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

古いスレッドには追加発言できません。