マットってなに?
ファイルフォーマットはどうなってるの?
テキストファイルに3X3の数値データが存在しますって書いてあると
私は
256 256 256
256 256 256
256 256 256
といったフォーマットなのか
256,256,256
256,256,256
256,256,256
なのか
256
256
256
256
256
256
256
256
256
なのかといろいろと想像が膨らむばかりでいったいどんなデータを読んでてエラーが
おきているのかわかりません。
いったいどんなフォーマットのデータを読むの?
っていうか、もしかして仕様を決めさせようとしていませんか?
とりあえず、こうしたらファイルの1行目が文字列として読み込めた。
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
char a[10];
ar.ReadString(a,10);
}
ちなみにファイルは
200
300
400
と縦に3個「200」「300」「400」と表記し、「texst.txt」として保存しました。
たてです。
アスキーデータを読むプログラムはどうしたら・・・
とりあえず、やりたいことはダイアログのピクチャーボックスに数字を256*256入れたい
んです。
主旨はビットマップの絵が他画面と重なっても消えないようにするなど、拡大しても消えない
1、ファイルを開く(アスキー)
A、データを読み出す
2、ボタンを押すと
A、ビットマップを作る
B、ビットマップ構造体にイメージデータをいれる
C、それをウインドウに転送する
それでファイルを開くところだけできないんですよ・・・;;
これを一番最初に書いておくべきでしたね。あなたは単に解らないところだけを聞こうと
したのでしょうが、皆さんそこに至るまでの背景が読みとれなくてやきもきしているよう
です。
繰り返しになりますが「使用上の注意」を今一度読み返してみてください。
また、例として挙げるのは適切かどうか解りませんが、↓の質問者とあなたの訊き方(とい
うか情報開示の仕方というか)を見比べてみてください。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010094.txt
# 本当にこの人初心者か? という疑問は残るのだが。
で、質問です。
・アスキーファイルに書かれているデータは、表示したいビットマップ画像のイメージ
データなんですね?
・ファイルを開くところだけできないということは、他の部分は正しく動いているという
確認がとれているんですね?
・Bの「ビットマップ構造体にイメージデータをいれる」ができているということは、確
認の際にどうやってデータを用意したのか私には解りませんが、そこをアスキーファイル
から読み込む、という形に置き換える所だけできていない、ということですね?
→ムリにSerializeを使わなくてもfopen(), fread()とかで
いけそうな気もしますが。
すいません・・以後気をつけます。それぞれの質問についてです
・アスキーファイルに書かれているデータは、表示したいビットマップ画像のイメージデータで
す。
・おそらく、正しく正常してると思います。
・そうです。
まだ出来ないのでよろしくお願いします
ソース書きますね。まずビットマップを作るクラスです。これはくわえました
void CPixmap::makePixmap()
{
dim_x = 256;
dim_y = 256;
if ( pix == NULL ) {
pix = new BYTE[dim_x*dim_y];
{BITMAPINFOHEADER infoHeader;
int i;
if(pMapBits)delete pMapBits;
infoHeader.biSize = sizeof(BITMAPINFOHEADER);
infoHeader.biWidth = dim_x;
infoHeader.biHeight = dim_y;
infoHeader.biBitCount = 8;
infoHeader.biPlanes = 1;
infoHeader.biXPelsPerMeter = 0;
infoHeader.biYPelsPerMeter = 0;
infoHeader.biClrUsed = 256;
infoHeader.biClrImportant = 0; // nColors;
infoHeader.biCompression = BI_RGB;
infoHeader.biSizeImage = dim_x * dim_y;
int colorAlloc = 256 * sizeof(RGBQUAD); // size of color tables
int bitsAlloc = infoHeader.biSize + colorAlloc;//+ infoHeader.biSizeImage;
pMapBits = (LPBITMAPINFO)new BYTE[bitsAlloc];
memset(pMapBits,80,bitsAlloc*sizeof(BYTE));
pMapBits->bmiHeader = infoHeader;
LPSTR pColor = ((LPSTR)pMapBits + (WORD)(pMapBits->bmiHeader.biSize));
for (i = 0; i < 256; i++)
((WORD*)pColor)[i] = i;
}
}
}
イメージデータは上に書いてあります。
そしてVIEWクラスです
void C***2View::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
m_pixmap->makePixmap();
MakeImage( m_image->pImage, m_pixmap->pix, m_pixmap->dim_x, m_pixmap->dim_y);
flushDisp(IDC_FIGURE);
}
void C****2View::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
// 描画用メッセージとして CFormView::OnPaint() を呼び出してはいけません
if( m_pixmap != NULL ) {
int W, H;
CRect rc;
GetDlgItem(IDC_FIGURE)->GetWindowRect(rc);
ScreenToClient(rc);
W = rc.Width();
H = rc.Height();
StretchDIBits(dc,rc.left,rc.top,W,H,0,0,m_pixmap->getDim_x(),m_pixmap->getDim_y
(),m_pixmap->getPix(),m_pixmap->getPMapBits(),DIB_PAL_COLORS,SRCCOPY);
}
}
void C****2View::MakeImage( unsigned short *pImage, BYTE *pix, int size_x,
int size_y )
{
int i;
int size;
size = size_x * size_y;
for( i=0; i<size; i++, pix++, pImage++ )
*pix = (BYTE) (((double)*pImage));
}
void C****View::flushDisp(int nID)
{
CRect rc;
GetDlgItem(nID)->GetWindowRect(rc);
ScreenToClient(&rc);
InvalidateRect(&rc,FALSE);
//GetUpdateRect(&rc,FALSE);
}
どうでしょうか?
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
for ( int i=0;i<256;i++){
for( int j=0;j<256;j++ ){
char a[5];
ar.ReadString(a,5);
unsigned short n = atoi(a);
TRACE(%d ,n);
}
TRACE(\n);
}
}
*** さん、動きません。実行はできますが、ファイル開かないです。
どこかにかいてあるのかも知れませんけど
「シリアライズ」にこだわる理由はなに?
ボタン操作のところにファイル読み込み処理つけたらどうなりますか?
できるなら、それでもいいです・・
教えてください
わたしはものの5分もかからずにできました
Serialize()を使わないなら、fopen(), fgets(), atoi(), fclose()を組み合わせるだけ
で行けると思います、というか確実に行けます。
これらの関数の使い方はご存じですよね? ご存じでなくても自力で調べる事はできますよね?
どうやったんですか?*** さん
もうずっとやってるんですができません・・