dポイントプレゼントキャンペーン実施中!

はじめまして、お世話になります。
『ダイアログで取得したファイル名』を、含むData構造体をファイルとして書き込む場合に限り、ファイルが出力されません。
Data構造体の文字列file_nameが『ダイアログで取得したファイル名』でなければ正常に出力されます。また、関数の返値や書き込み後のFILE構造体の中身を読み込んで調べたりしましたが、見る限りエラーはありませんでした。
開発ツールはMicrosoft Visual Studio 2005を使用しています。
どうか皆さんの知恵を貸してください! お願いします!

//ファイルとして出力する構造体
typedef struct
{
TCHAR file_name[256];
BYTE id;
}Data;

//ファイルを開くダイアログ
void OpenFile(HWND hWnd, TCHAR file_name[])
{
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("png files {*.bmp}\0*.bmp\0") TEXT("all files {*.*}\0*.*\0\0");
ofn.lpstrFileTitle = (LPWSTR)file_name;
ofn.nMaxFileTitle = CHAR_SIZE;
ofn.lpstrFile = NULL;
ofn.Flags = OFN_FILEMUSTEXIST;
GetOpenFileName(&ofn);
}

//ファイルを書き込む
void SaveData(Data save_file[])
{
FILE *file;
errno_terr;
size_t write_num;

//書き込む
err = _tfopen_s(&file, TEXT("hoge.map"), TEXT("w+b"));
if(err != 0) return;
write_num = fwrite(save_file, sizeof(Data), 6, file);

//きちんと書き込めているか確かめる
Data chek_data[6];
fseek(file, 0L, SEEK_SET);
fread(chek_data, sizeof(Data), 6, file);
fclose(file);
}

A 回答 (16件中11~16件)

Microsoft Visual Studio 2005とかというより、Windows はほとんど知らないんですけど^^ OpenFile() 内で、ローカル変数 ofn のアドレスを渡して、GetOpenFileName(&ofn) としてますが、これは意味あるんですか?^^


GetOpenFileName() というのは、ofn の中身を参照して、大域のライブラリ変数に何かをセットするとか?そうすると、GetOpenFileName() でエラーが起こっているとことなのかな?^^
=============
void OpenFile(HWND hWnd, TCHAR file_name[])
{
OPENFILENAME ofn;
…略…
GetOpenFileName(&ofn);
}

この回答への補足

GetOpenFileName(&ofn)は、ファイルを開くダイアログ作成する関数です。エラーを確かめたところありませんでした。

補足日時:2007/09/02 12:48
    • good
    • 0

当然、チェックしてるでしょうけど、ほんとに SaveData() が呼び出されているんですよね?^^ 万が一、チェックしてないなら

、端末に割り当てられていて stderr に出力できるなら、SaveData() の実行文の頭にデバッグライトで fprintf(stderr, "enter: SaveData()\n"); とか書いておけばどうですか?^^

この回答への補足

きちんと間違いなく呼び出されています。

補足日時:2007/09/02 12:40
    • good
    • 0

SaveData() 内の _tfopen_s() で失敗してるのですか?



あと、関係ないことですけど、fwrite() の戻り値をチェックして、余分な fread() はしないようにしたほうがいいと思います^^

void SaveData(Data save_file[])
{
FILE *file = NULL;
errno_t err = 0;
size_t rest = DATA_NUMBER;

//書き込む
err = _tfopen_s(&file, TEXT("hoge.map"), TEXT("w+b"));
if(err != 0 || file == NULL) {
fprintf(stderr, "error: SaveData\n";
return;
}
while (rest > 0) {
size_t write_num = fwrite(save_file, sizeof(Data), rest, file);
save_file += write_num;
rest -= write_num;
}
fclose(file);
}

この回答への補足

tfopen_sでエラーはありません。fwriteではきちんと書き込んだ数が返ってきます。さらに書き込み後のFILE構造体の中身を読み込めば、g_save_file配列の内容と全く同じ値です。

補足日時:2007/09/02 12:31
    • good
    • 0

//●グローバル変数


Data g_save_data[DATA_NUMBER];



Data g_save_data[DATA_NUMBER*2];
あるいは
Data g_save_data[MAX_PATH - 1];
にしてみて、変わらないですか?

この回答への補足

g_save_dataの要素の1つだけを、書き込んでみましたがやはりダメでした。どうやら配列は関係ないかと。

補足日時:2007/09/02 12:25
    • good
    • 0

ワイド文字でないとだめなのですか?


マルチバイトでもよいなら、

void OpenFile(HWND hWnd, TCHAR file_name[])
{
OPENFILENAMEA ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAMEA));
ofn.lStructSize = sizeof(OPENFILENAMEA);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("png files {*.bmp}\0*.bmp\0") TEXT("all files {*.*}\0*.*\0\0");
ofn.lpstrFileTitle = file_name;
ofn.nMaxFileTitle = CHAR_SIZE;
ofn.lpstrFile = NULL;
ofn.Flags = OFN_FILEMUSTEXIST;
GetOpenFileNameA(&ofn);
}

でいくかと思うのですが、
もしワイド文字でしたら、取得ファイル名を
WideCharToMultiByte 関数を使って、Anciタイプに
変えてから記録してみてはどうでしょうか?

この回答への補足

試してみたけどダメでした… 
ちなみにData構造体の内容が『ダイアログで取得したファイル名』と『直接コードに打ち込んだファイル名』の内容が文字コードを含めて全く同じでも、なぜか前者の場合のみファイルが出力されませんでした。

補足日時:2007/09/01 12:34
    • good
    • 0

> ofn.lpstrFileTitle = (LPWSTR)file_name;


不要なキャストはやめましょう。
もしここでコンパイルエラーになるなら、型が間違っているので
正しい型の変数を指定する必要があります。


あと、「事象が再現できる最低限のコード」を提示してください。
これだけだと、何が原因か言いようがないです。
(関数実装だけで、実際に呼んでいるところがないので、何が原因、と言えません。)

この回答への補足

>あと、「事象が再現できる最低限のコード」を提示してください。
>これだけだと、何が原因か言いようがないです。
その通りですね。全てのコードを提示しますのでよろしくお願いします。それと、型のキャストは関係なかったようです。

//●マクロ定数
#define CHAR_SIZE 256
#define DATA_NUMBER 6
#define CLASS_NAME TEXT("strClsName") //ウインドウクラスの名前
#define WINDOW_TITLE TEXT("my_window") //ウインドウ名
#define SCREEN_WIDTH 256 //画面・横
#define SCREEN_HEIGHT 256 //画面・縦

//●グローバル変数
Data g_save_data[DATA_NUMBER];

//●ファイルとして出力する構造体
typedef struct
{
TCHAR file_name[CHAR_SIZE];
BYTE id;
}Data;

//●ファイルを開くダイアログ
void OpenFile(HWND hWnd, TCHAR file_name[])
{
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("png files {*.bmp}\0*.bmp\0") TEXT("all files {*.*}\0*.*\0\0");
ofn.lpstrFileTitle = (LPWSTR)file_name;
ofn.nMaxFileTitle = CHAR_SIZE;
ofn.lpstrFile = NULL;
ofn.Flags = OFN_FILEMUSTEXIST;
GetOpenFileName(&ofn);
}

//●ファイルを書き込む
void SaveData(Data save_file[])
{
FILE *file;
errno_terr;
size_t write_num;

//書き込む
err = _tfopen_s(&file, TEXT("hoge.map"), TEXT("w+b"));
if(err != 0)return;
write_num = fwrite(save_file, sizeof(Data), DATA_NUMBER, file);

//きちんと書き込めているか確かめる
Data chek_data[6];
fseek(file, 0L, SEEK_SET);
fread(chek_data, sizeof(Data), DATA_NUMBER, file);
fclose(file);
}

//●ウインドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN: //Escキーで終了
if(wParam == VK_ESCAPE)
{
DestroyWindow(hWnd);
}
break;
case WM_COMMAND: //メニューバー
switch(LOWORD(wParam))
{
case ID_SAVEFILE:
SaveData(g_save_data);
break;
case ID_OPENFILE:
OpenFile(hWnd, g_save_data);
}
break;
case WM_DESTROY: //ウインドウが破棄された
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return TRUE;
}

//●エントリポイント
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
ZeroMemory(g_save_data, sizeof(g_save_data));

//ウインドウクラスの作成と登録
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wc.lpszClassName = CLASS_NAME;
wc.hIconSm = NULL;
if(!RegisterClassEx(&wc))
{
return FALSE;
}

//ウインドウを生成
HWND hWnd;
int width = SCREEN_WIDTH + GetSystemMetrics(SM_CXDLGFRAME) * 2;
int height = SCREEN_HEIGHT + GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);
hWnd = CreateWindow(CLASS_NAME, WINDOW_TITLE, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInstance, NULL);
if(!hWnd)
{
return FALSE;
}

//ファイルを読み込む
LoadData(g_StageData, &g_EditData);

//メッセージループ
MSG msg;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE );

while(WM_QUIT != msg.message)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}

補足日時:2007/09/01 12:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!