for ( i=0; i<HEADER_SIZE; i++, tmp++) {
fp->Read( tmp, sizeof( unsigned short ) )
}
このるーぷおかしいのでは
CImage().pImageのサイズって[IMAGEDATA_SIZE]なのでは
fp->Read(c_image->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);
こうなるのではないですか?
>for ( i=0; i<HEADER_SIZE; i++, tmp++) {
> fp->Read( tmp, sizeof( unsigned short ) )
>}
>このるーぷおかしいのでは
>CImage().pImageのサイズって[IMAGEDATA_SIZE]なのでは
>
>fp->Read(c_image->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);
>
>こうなるのではないですか?
そうです;;間違ってました・・でもまだ問題は解決しません・・
>このc_imageがどこで宣言されているかを教えてください。
>.cppで、関数の中(例えばnewの直前)で宣言していますか?
>それともどこか別の場所で宣言していますか?
CDocクラスのCDoc()のところです
CDoc::CDon()
{
.
.
CImage *cimage;
.
.
.
}
ってことですか?これじゃ保持できません。
変数のスコープや寿命などについてどの程度理解してますか?
誤字です。
>CDoc::CDon()
CDoc::CDoc()
でした。すいません。
>CDoc::CDon()
{
.
.
> CImage *cimage;
.
.
.
}
>ってことですか?これじゃ保持できません。
>変数のスコープや寿命などについてどの程度理解してますか?
あまりよくわからないです・・CImage *cimage;でそのクラスのものを使えるのではないのです
か?
euro2004さん、間違いです。CImage *cimage;は
{クラスの動作の定義を行います}というところで宣言しています。
そいません。言い方が悪かったです;;
>そいません。言い方が悪かったです;;
すいませんです(汗
>>ってことですか?これじゃ保持できません。
>>変数のスコープや寿命などについてどの程度理解してますか?
>あまりよくわからないです・・CImage *cimage;でそのクラスのものを使えるのではないので
す
か?
Cから修行してみては?
Serialize(CArchive& ar)にすべて書くことにしました。ですがデータが読めません。
これはどういうことでしょうか?#define HEADER_SIZE 7904、#define IMAGEDATA_SIZE
65536、 char *header;、unsigned short *pImage;は宣言しました
CFile* fp = ar.GetFile();
filePath = fp -> GetFilePath();
if( fp->GetLength() < HEADER_SIZE ) {
return;
}
fp->Seek( HEADER_SIZE, CFile::begin );
int i;
unsigned short *tmp;
for ( i=0, tmp=pImage;i<IMAGEDATA_SIZE; i++, tmp++) {
fp->Read(tmp,sizeof(unsigned short));
}
}
}
読み込みファイルはどんなのですか
Serialize(CArchive& ar)ではなくダイアログを作ってフォルダを開いて読むプログラムだと
読めるんですよ。
でもファイル(右上の)から選択したいんでSerialize(CArchive& ar)で行いたいんですよ。
下のがフォルダをつかったものです。これだと読めます。
void C**View::OnOpendir()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
BROWSEINFO bi;
TCHAR szDir[MAX_PATH];
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
// Shell の標準のアロケータを取得
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
// BROWSEINFO 構造体を埋める
ZeroMemory(&bi,sizeof(bi));
bi.hwndOwner = m_hWnd; // オーナーウィンドウハンドルを設定
bi.pidlRoot = 0;
bi.pszDisplayName = 0;
bi.lpszTitle = タイトルです。;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
// フォルダの参照ダイアログボックスの表示
pidl = SHBrowseForFolder(&bi);
if (pidl)
{
if (SHGetPathFromIDList(pidl,szDir))
{
m_folderName = szDir;
SetDlgItemText( IDC_DIRECTORY, m_folderName );
}
pMalloc->Free(pidl);
}
pMalloc->Release();
}
SetCurrentDirectory( m_folderName );
if( find.FindFile( GetWildCardFromDlg(), 0 )) {
find.FindNextFile();
m_fileName = find.GetFileName();
SetDlgItemText( IDC_SRCFILENAME, m_fileName );
DisplayImage( find.GetFilePath() );
}
}
CString C**View::GetWildCardFromDlg()
{
return ( *.MR );
}
int lastflag = 0;
そして別クラスで
void CImage::ReadDataFromFile(LPCSTR fileName)
{
CFile hFile;
hFile.Open( fileName, CFile::modeRead, NULL );
if( hFile.GetLength() < HEADER_SIZE ) {
hFile.Close();
return;
}
hFile.Seek( HEADER_SIZE, CFile::begin );
int i;
unsigned short *tmp;
for ( i=0, tmp=pImage; i<256*256; i++, tmp++ ) {
hFile.Read( tmp, sizeof( unsigned short ) );
}
hFile.Close();
}
となっています。
これをファイルから開けるようにしたいんです。教えて欲しいです。
// C**Doc シリアライゼーション
void C**Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
CImage *c_image=new CImage();
c_image->ReadDataFormFile(ar.GetFile()->GetFilePath());
// どこかで
// delete c_image;
}
}
こんなかんじじゃだめなんですか
アスキーファイル(テキストファイル)じゃなくてバイナリーファイルだったんだ・・・。
あらかじめ、C**Docクラスにメンバー変数として、「CImage *m_pImage」をpublicで
宣言しておきます。
C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます。
そしてシリアライズでは
void C**Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
if ( m_pImage != NULL )
{
delete m_pImage;
m_pImage = new CImage();
}
ar.Read(m_pImage->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);
}
}
とします。
シリアライズの関数の中はこれだけで十分です。
他に余分なものはいらないはずです。
何に使うのかわからないフルパスの取得やファイルポインタを使用しての読み込みといった
複雑なプログラムよりはこの方が単純でわかりやすいと思います。