ページ 11

ReadFile,WriteFile関数でデータを扱いたい

Posted: 2012年11月17日(土) 01:39
by bonbo
早速ですが質問させていただきます。
ReadFile,WriteFile関数を使ってメモ帳を作っているサンプルはたくさんあったのですが、
文字列以外(test[0]==1などの情報)を保存するにはどうしたらよいのでしょうか。
(一応fwriteやfreadをほかの関数と組み合わせて似た機能を作ることはできるのですが、
コモンダイアログボックスがかっこいいので使ってみたいのです。)
コードなしで申し訳ないのですが、よろしくお願いします。

Re: ReadFile,WriteFile関数でデータを扱いたい

Posted: 2012年11月17日(土) 09:54
by softya(ソフト屋)
まずお断りしますが、コモンダイアログボックスとReadFile,WriteFile関数は何の関わりを持ちません。
コモンダイアログボックスを使った上でfread/fwriteを使うことも出来ますが、ReadFile,WriteFile関数をどうしても使いたいのでしょうか?

Re: ReadFile,WriteFile関数でデータを扱いたい

Posted: 2012年11月17日(土) 10:17
by bonbo
>soft屋さん
ありがとうございます
>コモンダイアログボックスとReadFile,WriteFile関数は何の関わりを持ちません。
GetOpenFileName,GetSaveFileName関数
の後に別の関数を使って開くということでしょうか、
ReadFile,WriteFile関数しか知らないため、このようなタイトルでトピックを立ててしまいました。
この関数にこだわりはないのでそれ以外の方法で開くことができるならば、
その方法を教えていただけると助かります。
(必要でしたらトピックも立て直します。)

Re: ReadFile,WriteFile関数でデータを扱いたい

Posted: 2012年11月17日(土) 11:20
by softya(ソフト屋)
GetOpenFileName,GetSaveFileName関数で得られるのはファイル名なのでfopenすれば良いだけですね。
別トピックは立てなくて良いですよ。必要ならタイトルの方を書き換えます。

Re: ReadFile,WriteFile関数でデータを扱いたい

Posted: 2012年11月17日(土) 11:50
by bonbo
私は何か勘違いをしてるかもしれないのですが
fopenで開くと開くファイルのディレクトリに制限がかかったりしないでしょうか

Re: ReadFile,WriteFile関数でデータを扱いたい

Posted: 2012年11月17日(土) 11:55
by softya(ソフト屋)
>fopenで開くと開くファイルのディレクトリに制限がかかったりしないでしょうか

[誤解を生みそうな部分を補正]
VC++などのC言語で使われる標準関数のfopenはWindowsの場合は中でcreateFileしていますので、fopenで制限される様なディレクトリはcreateFileでも制限されます。
※ ReadFile,WriteFile関数のopenにあたる関数はcreateFileです。

Re: ReadFile,WriteFile関数でデータを扱いたい

Posted: 2012年11月17日(土) 13:32
by bonbo
>Windowsの標準関数のfopenは中でcreateFileしていますので、fopenで制限される様なディレクトリはcreateFileでも制限されます
すみません、実はfopenはexeと同じディレクトリからしか読み込めないと勘違いしていたのです。
どうやらいろいろな場所に保存できるようですね。
とりあえずコードを書いたのですが、

コード:

TCHAR szFile[MAX_PATH];//グローバル
int test1[10];
int SaveTest(HWND);

コード:

int SaveTest(HWND hEdit)
{
	FILE * fp;
	OPENFILENAME ofn;
    HANDLE hFile;
    DWORD dwAccBytes;
    
	LPTSTR lpszBuf;
	HGLOBAL hMem;

	hMem = GlobalAlloc(GHND, sizeof(int) * 10);										//int型のファイル10個分の領域を確保
	lpszBuf = (LPTSTR)GlobalLock(hMem);												//
    
    memset(&ofn, 0, sizeof(OPENFILENAME));											//ofnのアドレスからsizeof(OPENFILENAME)だけ0で書き換える
    ofn.lStructSize = sizeof(OPENFILENAME);											//自分の環境でのOPENFILENAME型のサイズを特定
    ofn.hwndOwner = hEdit;															//owner
    ofn.lpstrFilter = TEXT("テスト(*.test)\0*.test\0All files(*.*)\0*.*\0\0");		//保存形式の制限
    ofn.lpstrFile = szFile;															//保存するファイル名
    ofn.lpstrFileTitle = szFileTitle;												//
    ofn.nFilterIndex = 1;															
    ofn.nMaxFile = MAX_PATH;														//十分な大きさ
    ofn.nMaxFileTitle = MAX_PATH;													//
    ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;								//上書きの確認とreadonly非表示
    ofn.lpstrDefExt = TEXT("TeSt");													//デフォルト名
    ofn.lpstrTitle = TEXT("名前を付けて保存する");									//タイトル欄

    if(GetSaveFileName(&ofn) == 0){													//コモンダイアログボックスが開けなかったらエラー
		MessageBox(hEdit, 
			TEXT("ファイルが開けません"), 
			TEXT("テスト"),
			MB_ICONEXCLAMATION | MB_OK);
        return -1;
}
	fp=_tfopen(szFile,TEXT("wb"));
	fwrite(test1,sizeof(int),10,fp);
	fclose(fp) ;
	SendMessage(hEdit, EM_SETMODIFY, FALSE, 0);
	GlobalUnlock(hMem);
	GlobalFree(hMem);

	return 0;
}
半分コピーなのでめちゃくちゃかもしれませんが
なんとか保存できました。
同じ要領でfreadのほうもできました。
どうもありがとうございました。