データを取得して出力出力するには?

解決


スシッチ  2002-12-29 02:16:01  No: 50885  IP: [192.*.*.*]

ファイル(テキストとバイナリ)からデータを受け取り、
それを計算して出力するプログラムを作りたいのですが
どうすればよいでしょう?APIを使用しています。

色々やってみたのですがまだ未熟ですので
様々なエラーや結果の無表示などにぶつかっています。
よかったら気をつける点などもご教授ください。

編集 削除
YuO  2002-12-29 07:45:57  No: 50886  IP: [192.*.*.*]

漠然としていて答えようがないですね……。
とりあえず,デバッガだのprintf(or MessageBox)だのを駆使して,原因を探るところから始めて下さい。

編集 削除
スシッチ  2002-12-29 14:32:16  No: 50887  IP: [192.*.*.*]

cretefileを使ってファイルを呼び出し
readfileで読み込んで、、、、、
と行っているのですが
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
と出てしまいそこで困っています。

編集 削除
YuO  2002-12-29 22:25:43  No: 50888  IP: [192.*.*.*]

createfile? readfile?
まぁ,それはともかく,
Windows Applicationとして生成するなら,エントリポイントは,
int main (void); (又はint main (int argc, char **argv); )
ではなく,
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
としないといけません。

mainを使うのであれば,Console Applicationとして生成する必要があります。

編集 削除
スシッチ  2002-12-30 19:33:26  No: 50889  IP: [192.*.*.*]

お返事ありがとうございます

あれからなんとか
「バイナリデータを読み込み出力する」
プログラムを作ってみたのですが、
ファイルが読み込めませんと言われます。
エラーや警告も無かったのですがどうしてでしょうか?

編集 削除
YuO  2002-12-31 00:42:10  No: 50890  IP: [192.*.*.*]

> ファイルが読み込めませんと言われます。

で?
それはあなたが表示させたメッセージでしょう?
その時点でerrnoなりGetLastError()なりで原因を探りましたか?


> エラーや警告も無かったのですがどうしてでしょうか?

コンパイルが通るのは,あくまで文法があっている,という以上の意味はありません。
アルゴリズムなどが正しいかどうかは,そのあとにdebugする必要があります。

編集 削除
MK  2002-12-31 08:02:26  No: 50891  IP: [192.*.*.*]

横から失礼します。

簡単なPGのようですので、本当に困っていて解決を望んでいるのなら、コードを
載せることをお勧めします。

今の質問方法だと話がなかなか先に進まないような気がします。

編集 削除
スシッチ  2002-12-31 15:00:44  No: 50892  IP: [192.*.*.*]

ご助言ありがとうございます。
あれから色々やってなんとかデータを取り込むことに成功しました。
しかし、コード事態は何もいじっていないのに成功したので
理由をおしえてもらいたくコードを載せます。

/******************************************************************************
 *  ファイルオープンプログラム
 ******************************************************************************/
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#define  WALL  0xFF
#define  NON   0x00

#define  ROW   5
#define  COL   5

BYTE bArray[ROW][COL];

void OnCreate(HWND hWnd);
void OnPaint(HDC hDC);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char szClassNme[] = "ウィンドウクラス・ネーム";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
                   LPSTR lpszCmdLine, int nCmdShow)
{
    HWND hWnd;
    MSG msg;
    WNDCLASS myProg;
    if (!hPreInst) {
        myProg.style            =CS_HREDRAW | CS_VREDRAW;
        myProg.lpfnWndProc        =WndProc;
        myProg.cbClsExtra        =0;
        myProg.cbWndExtra        =0;
        myProg.hInstance        =hInstance;
        myProg.hIcon            =NULL;
        myProg.hCursor        =LoadCursor(NULL, IDC_ARROW);
        myProg.hbrBackground    =(HBRUSH)GetStockObject(WHITE_BRUSH);
        myProg.lpszMenuName    =NULL;
        myProg.lpszClassName    =szClassNme;
        if (!RegisterClass(&myProg))
            return FALSE;
    }
    hWnd = CreateWindow(
    szClassNme,
        "プログラミング",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) (msg.wParam);
}

/******************************************************************************
 * コールバック関数
 ******************************************************************************/

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC = NULL;
    PAINTSTRUCT ps;

    switch(Msg)
    {
    case WM_CREATE:
        OnCreate(hWnd);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        OnPaint(hDC);
        EndPaint(hWnd, &ps);
        break;

    default:
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }

    return 0;
}


/******************************************************************************
 * メッセージ処理
 ******************************************************************************/

void OnCreate(HWND hWnd)
{
    HANDLE hFile = NULL;
    DWORD  dwRead;
    BYTE   pBuf[16];

    hFile = CreateFile("date.dat", GENERIC_READ | GENERIC_WRITE, 0, 
        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if(hFile == INVALID_HANDLE_VALUE){
        MessageBox(hWnd, "ファイルがオープンできません", "ファイルのオープンの失敗", MB_OK);
    }
  
    // データの読み出し
    for(int i = 0; i < ROW; i++)
    {
        ReadFile(hFile, &pBuf, sizeof(pBuf), &dwRead, NULL);
        for(int j = 0; j < COL; j++)
        {
            bArray[i][j] = pBuf[j];
        }
    }

  CloseHandle(hFile);
}

/******************************************************************************/

void OnPaint(HDC hDC)
{
    HBRUSH hOldBrush = NULL;

    hOldBrush = (HBRUSH)SelectObject(hDC, GetStockObject(BLACK_BRUSH));

    for(int i = 0; i < ROW; i++)
    {
        for(int j = 0; j < COL; j++)
        {
            if(bArray[i][j] == WALL)
                Rectangle(hDC, i * 32, j * 32, (i + 1) * 32, (j + 1) * 32);
        }
    }

    SelectObject(hDC, hOldBrush);
}

これはバイナリデータを読み込みそれを白黒画像表示
させるものです。date.datというものがそのデータです。

さらにこのデータをダイアログで指定したいのですが
どうすればよいでしょうか?

編集 削除
YuO  2002-12-31 15:34:40  No: 50893  IP: [192.*.*.*]

> あれから色々やってなんとかデータを取り込むことに成功しました。
> しかし、コード事態は何もいじっていないのに成功したので
> 理由をおしえてもらいたくコードを載せます。

カレントディレクトリにファイルがなかったのでしょう。
GetLastErrorとFormatMessageを使えば,APIの実行に失敗した理由が特定できます。
エラー通知は,そういうことをしないと意味がないです。


> さらにこのデータをダイアログで指定したいのですが

GetOpenFileName APIを使えば可能です。
#自作してもいいけど面倒なだけ。

編集 削除
MK  2002-12-31 22:18:12  No: 50894  IP: [192.*.*.*]

スシッチさん。こんばんは。

コードを実行してみたらエラーは出ないのですが、画面にファイルの内容が表示されません。勉強のために表示する方法を教えていただけないですか?

スシッチさん。またはどなたか分かる方よろしくお願い致します。

**********************************
いろいろ調べてみたのですが、WIN32 Applicationにて、ファイルを読み込む方法やプログラム中に”×××”と書かれた文字列を画面に表示する方法あるいは、Console  Applicationにてファイルを読み込み画面に表示する方法はネット上にたくさんあるのですが、WIN32 Applicationにて、ファイルを読み込みそのまま表示する方法が見つからなかったので。

編集 削除
YuO  2003-01-01 00:32:08  No: 50895  IP: [192.*.*.*]

わからないこと:MKさんがこのスレッドにこの質問を投げた理由。
後半部分は新しくスレッドを起こして書くのが適当では?


> コードを実行してみたらエラーは出ないのですが、画面にファイルの内容が表示されません。
> 勉強のために表示する方法を教えてい ただけないですか?

記載されたコードを読む限り,データが0xFFの時に四角を表示して,
それ以外のときは何もしない,ということをやっています。
当然,普通のテキストファイルであれば何も表示されません。
#UTF-16エンコードされたファイルを除く。


> いろいろ調べてみたのですが、WIN32 Applicationにて、ファイルを読み込む方法や
> プログラム中に”×××”と書かれた文字列を画面に表示する方法あるいは、
> Console Applicationにてファイルを読み込み画面に表示する方法はネット上にたくさんあるのですが、
> WIN32 Applicationにて、ファイルを読み込みそのまま表示する方法が見つからなかったので。

「応用する」ということを覚えましょう。
ファイルを読み込むことが出来て,文字列を表示することが出来れば,
ファイルに格納されている文字列を表示することは難しくないです。
#スクロールとかを折返しをやると難しくなりますが。

編集 削除
MK  2003-01-01 06:42:29  No: 50896  IP: [192.*.*.*]

皆さん。新年あけましておめでとうございます。
YuOさん。回答有難うございます。

>わからないこと:MKさんがこのスレッドにこの質問を投げた理由。
>後半部分は新しくスレッドを起こして書くのが適当では?

う〜〜ん。なかなか手厳しいですね。
私の考えでは色々思うことがあって、ここに書くのが最適だと判断したのですが。
(スシッチさんのことも考慮して)
問題ありなら以後気を付けます。


>「応用する」ということを覚えましょう。
>ファイルを読み込むことが出来て,文字列を表示することが出来れば,
>ファイルに格納されている文字列を表示することは難しくないです。
>#スクロールとかを折返しをやると難しくなりますが。

一応がんばって応用してみたのですが、うまくいかなかったので質問しました。
最終的には、data.datのバイナリデータが壊れていたのが原因でした。

ただ、初心者の私としては、ReadFileという関数が初めてだったので、それとペアで使われる一般的な関数(画面に表示する)があると推測して、自分の応用したコードよりスマートな書き方を教えていただけないかと期待して質問しました。
(意図をしっかり書かなくてすみません)


最後に私と同じ初心者の方、以下を参考ください。
http://www7.plala.or.jp/keny01/win32/07-04.html

編集 削除
MK  2003-01-01 08:05:58  No: 50897  IP: [192.*.*.*]

スシッチさん。新年あけましておめでとうございます。

わたしが割り込んだために、話が脱線してごめんなさい。
(私の質問および誰かの回答がそのままスシッチさんの役に立つと思ったので)

スシッチさんのダイアログの質問に対しては以下を参照にして下さい。
http://www.kumei.ne.jp/c_lang/sdk/sdk_73.htm

編集 削除
スシッチ  2003-01-01 16:33:19  No: 50898  IP: [192.*.*.*]

新年明けましておめでとうございます。

MKさん、別に気にしないでください。
僕も超が付く初心者なので。

Yuoさん、ご返答や色々と
気を使っていただきありがとうございました。

お二人の意見を参考に組んでみたいと思っております。

この件に関しては「解決」ということで
ありがとうございました。

編集 削除