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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bonbo

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

#1

投稿記事 by bonbo » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

まずお断りしますが、コモンダイアログボックスとReadFile,WriteFile関数は何の関わりを持ちません。
コモンダイアログボックスを使った上でfread/fwriteを使うことも出来ますが、ReadFile,WriteFile関数をどうしても使いたいのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

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

#3

投稿記事 by bonbo » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

GetOpenFileName,GetSaveFileName関数で得られるのはファイル名なのでfopenすれば良いだけですね。
別トピックは立てなくて良いですよ。必要ならタイトルの方を書き換えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

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

#5

投稿記事 by bonbo » 13年前

私は何か勘違いをしてるかもしれないのですが
fopenで開くと開くファイルのディレクトリに制限がかかったりしないでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

>fopenで開くと開くファイルのディレクトリに制限がかかったりしないでしょうか

[誤解を生みそうな部分を補正]
VC++などのC言語で使われる標準関数のfopenはWindowsの場合は中でcreateFileしていますので、fopenで制限される様なディレクトリはcreateFileでも制限されます。
※ ReadFile,WriteFile関数のopenにあたる関数はcreateFileです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

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

#7

投稿記事 by bonbo » 13年前

>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のほうもできました。
どうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る