![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
はじめまして、お世話になります。
『ダイアログで取得したファイル名』を、含む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);
}
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?e8efa67)
No.6
- 回答日時:
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![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?e8efa67)
No.4
- 回答日時:
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:31No.2
- 回答日時:
ワイド文字でないとだめなのですか?
マルチバイトでもよいなら、
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構造体の内容が『ダイアログで取得したファイル名』と『直接コードに打ち込んだファイル名』の内容が文字コードを含めて全く同じでも、なぜか前者の場合のみファイルが出力されませんでした。
No.1
- 回答日時:
> 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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
クリティカルエラー Expressio...
-
Makefile作成時の拡張子.oとは?
-
マクロ コンパイルがグレーバック
-
ILSpyで、デコンパイルできない。
-
C言語でヘッダファイルにグロー...
-
「fatal error C1189」を回避す...
-
エクセルVBAではRound...
-
VB6で開発中…標準モジュール間...
-
1 つ以上の複数回定義されてい...
-
<math.h>があるのにsqrtが・...
-
セミコロンについて
-
” OS ビルド ” の意味が分か...
-
外部シンボル "_main"は未解決です
-
bccでwinmm.libをリンクする方...
-
コンパイルエラー:ユーザ定義...
-
sys/types.hの必要性について
-
コンパイル??
-
不要な #include
-
ビルドとリビルドの違いを教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
「fatal error C1189」を回避す...
-
Makefile作成時の拡張子.oとは?
-
ILSpyで、デコンパイルできない。
-
1 つ以上の複数回定義されてい...
-
外部シンボル "_main"は未解決です
-
セミコロンについて
-
C言語でヘッダファイルにグロー...
-
” OS ビルド ” の意味が分か...
-
マクロ コンパイルがグレーバック
-
【VC++6.0(MFC)】警告「LINK : ...
-
クリティカルエラー Expressio...
-
PRO*C コンパイルエラー
-
[c++] <pthread.h>がinclude で...
-
<math.h>があるのにsqrtが・...
-
ビルドとリビルドの違いを教え...
-
CImageクラスの使用について
-
戻り値について
-
コンパイルエラー:ユーザ定義...
おすすめ情報