![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
はじめまして、お世話になります。
『ダイアログで取得したファイル名』を、含む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?5a7ff87)
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?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
C言語でヘッダファイルにグロー...
-
C++コンパイル時に『 C1083: in...
-
「fatal error C1189」を回避す...
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
クリティカルエラー Expressio...
-
cygwin でstackdump
-
構造体をファイルに出力できません
-
1 つ以上の複数回定義されてい...
-
【VC++6.0(MFC)】警告「LINK : ...
-
コンパイルエラー:ユーザ定義...
-
C言語でmからnまでの合計を求め...
-
ビルドとリビルドの違いを教え...
-
sys/types.hの必要性について
-
” OS ビルド ” の意味が分か...
-
PRO*C コンパイルエラー
-
外部シンボル "_main"は未解決です
-
FindFirstFileについて教えてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
ILSpyで、デコンパイルできない。
-
Makefile作成時の拡張子.oとは?
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
外部シンボル "_main"は未解決です
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
戻り値について
-
C言語でmからnまでの合計を求め...
-
C++コンパイル時に『 C1083: in...
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
PRO*C コンパイルエラー
-
【VC++6.0(MFC)】警告「LINK : ...
-
[c++] <pthread.h>がinclude で...
おすすめ情報