• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++ ini 書き込みについて)

C++ ini書き込みについて

このQ&Aのポイント
  • C++のini書き込みに関するソースコードがありますが、作成できません。どうすればいいのでしょうか?
  • test.iniファイルを作成するソースコードがC++のtest.exeに含まれていますが、作成できません。どのように対処すればいいのでしょうか?
  • C++のtest.exeを実行すると、test.iniファイルが作成されません。原因は何でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.5

>test.cpp 内には >コモンダイアログ 「新規作成,名前を付けて保存,上書き保存」 とエディットコントロールがあるのですが >それが表示されません。 どうすればいいのですか? -Wオプション付きでコンパイルすればいいです。 とりあえず…… ・コンソールアプリケーション  main()から始まる。 ・Windowsアプリケーション  WinMain()から始まる。 の2種類がある。ということをお勉強した上でコード書いてください。 # ダイナミックリンクライブラリ(DllMain()から始まる)ってのもありますが、まぁ当面は関係ないでしょう。 >※test.ini の読み取りは メニューバーにある「version更新」を押すと test.iniをコマンドプロンプトのウィンドウ で開けばいいと考えているのですが これはできますか? コマンドプロンプト開く必要すらありません。 「version更新」のイベントハンドラ内にmain()に書いた内容を記述すればいいでしょう。 >※ファイルを展開すれば ファイル内容及び ソースコードが分かるのですが > 確認せずに!? 投稿ということは 大抵ファイルを展開していない 自分の予想として・・・とか > で投稿をしているのではないかぁと思います。 展開して、中を見た上で呆れて回答しただけですがなにか? 現状での最新ソースがどうなっているかも不明ですし、今はアップローダから削除されてしまったようですが。 # さしたる重要度も無いのでRAMデイスクにDL&展開したので、私の手元には残っていませんけどね。 # ついでに、後からこの質問見た人にはどんなコードだったのかさっぱりなんで似たような問題に直面した人には役に立たない質問になってますが。 で…カレントディレクトリについて指摘しましたが理解されていないようなので現状で起こりうる問題も指摘しておきますかね。 # やり方次第で発生しないけど最新ソース確認できないし。 1)メニューバーにある「version更新」押下。 =>iniファイルが無いので新規作成。 2)コモンダイアログ「新規作成,名前を付けて保存,上書き保存,・・」で別フォルダーに移動してファイル名指定して[OK]押下。 =>こっそりカレントディレクトリ変更されました 3)再度、メニューバーにある「version更新」押下。 =>iniファイルが無いので新規作成。 最新ソースは不明ですし、私の回答はお気に召さなかったようなので以後は控えますね。

RMCA
質問者

補足

bcc32 -W -w- test.cpp →ウィンドウが表示される bcc32 test.cpp (オプションなし) →test.iniの読み込みを コマンドプロンプトのウィンドウで表示されるだけで ウィンドウは表示されません test.cpp にはモジュールなどがあるのですが -W -w- のオプションがなしだと test.iniをコマンドプロンプトで表示されるだけなので どうにかしてやりたいのですが どうすればいいのですか? ・-W オプションでコンパイルリンクすればいいです。!?  これは-W windowsアプリケーションを指定しています。  -W -w- だと -w- は関数などで使うときに必要と・・ いうことは test.cpp には関数. windowsアプリケーションを指定している test.cpp 一部ソース メイン ウィンドウを作成するソース // // 関数: InitInstance(HINSTANCE, int) // // 目的: メイン ウィンドウを作成します。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 hWnd = CreateWindow(TEXT("Mymeako"), TEXT("Mymeako"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } int ini(); //.ini読み込み int createini(); //.ini作成 int main() { FILE *fp; if ( (fp = fopen("test.ini","r")) != NULL ){ //ファイル存在確認 //存在する fclose(fp); ini(); }else{ //存在しない fclose(fp); createini(); } return 0; } int ini() { BOOL bRet; TCHAR fPath[MAX_PATH]; ZeroMemory(fPath,sizeof(fPath)); //バッファ初期化 bRet = GetCurrentDirectory(MAX_PATH,fPath); if(bRet == 0){ //GetCurrentDirectory失敗 LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); printf("%s",lpMsgBuf); ExitProcess(-1); return -1; } lstrcat(fPath,_T("\\test.ini")); TCHAR buf[1024]; //[TEST]のTESTMSGの文字列をbufに格納 GetPrivateProfileString(_T("TEST"),_T("TESTMSG"), _T("NoSection or Key"),buf,sizeof(buf),fPath); printf(buf); return 0; } int createini() { HANDLE hFile; //test.ini作成 hFile = CreateFile(_T("test.ini"),GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE) //CreateFile失敗 { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); printf("%s",lpMsgBuf); CloseHandle(hFile); ExitProcess(-1); return -1; } //test.iniに初期情報?書き込み TCHAR buf[] = _T("[TEST]\r\nTESTMSG=The version of a system = 1.8.3 System Operating check = ok System Operation Time =2013/06/01"); DWORD dwSize; BOOL bRet; bRet = WriteFile(hFile,buf,sizeof(buf),&dwSize,NULL); if(!bRet){ //WriteFile失敗 LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); printf("%s",lpMsgBuf); CloseHandle(hFile); ExitProcess(-1); return -1; } CloseHandle(hFile); ini(); return 0; } としています。 メイン ウィンドウのメッセージ 処理は コモンダイアログ 「新規作成,名前を付けて保存,上書き保存」 ・エディットコントロール ・バージョン情報 メッセージハンドラです。 ※これでソースコード一部は分かりますが test.cpp test.rc resource.h などをzipにして圧縮していますので ソースコードを見ながら 修正などをしてください。 ソースコード・アップロード:http://www.dotup.org/uploda/www.dotup.org5124990.zip.html コモンダイアログ:http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_file2.html メッセージダイアログ:http://gurigumi.s349.xrea.com/programming/visualcpp/intro8.html 参照サイト:http://gurigumi.s349.xrea.com/programming/visualcpp/ c ini 書き込み:http://www.little-diary.net/archives/78/ ([C++] .iniファイル 読み込み [WinAPI]・.iniファイル作成から読み込んで出力まで) ※ファイルを展開すれば ファイル内容及び ソースコードが分かるのですが 確認せずに!? 投稿ということは 大抵ファイルを展開していない 自分の予想として・・・とか で投稿をしているのではないかぁと思います。

その他の回答 (4)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>★★★簡単にいうと ウィンドウが開いて正常にメニューバーが表示されるのですが >ウィンドウが現れず コマンドからtest.iniを読み込んでやっています。 コマンドプロンプトのウィンドウは開いたんじゃないですか? >この場合 どうすればいいのですか?★★★ やりたいようにプログラミングしてください。 最初の質問の「test.iniを作成するソースコードがはいっているのですが作成できません。」については解決したかと思われます。 それ以外にウィンドウ開いて何をしたいのか、iniファイルの保存と読み込みをどのタイミングでやりたいのか…。 どれも不明です。 カレントディレクトリ変更されたらiniファイルが行方不明になるようですし……。 どこまでサポートされるかは不明ですが、iniファイル扱うなら GetPrivateProfileString() http://msdn.microsoft.com/ja-jp/library/cc429779.aspx GetPrivateProfileInt() http://msdn.microsoft.com/ja-jp/library/cc429763.aspx WritePrivateProfileString() http://msdn.microsoft.com/ja-jp/library/cc429952.aspx 辺りを使った方がいいと思いますよ。

RMCA
質問者

補足

コマンドプロンプトのウィンドウは開いていますが これでもtest.iniを読み込むだけとなっていますが test.cpp 内には コモンダイアログ 「新規作成,名前を付けて保存,上書き保存」 とエディットコントロールがあるのですが それが表示されません。 どうすればいいのですか? せ ★タイミング★ test.exe を起動すると 「test.iniが存在する場合」 →コマンドプロンプトのウィンドウで読み取りをするのではなくて test.exeにはコモンダイアログなどがあるのでそのウィンドウが表示されたらOKです。 ※test.ini の読み取りは メニューバーにある「version更新」を押すと test.iniをコマンドプロンプトのウィンドウ で開けばいいと考えているのですが これはできますか? すでに test.cppにはtest.iniをなかったら→作る あったら→version更新を押したらコマンドプロンプトのウィンドウで開く とするようにしたいです。 ・bcc32 -W -w- test.cpp の場合 ・メニューバー及びウィンドウが表示される ・bcc32 test.cpp の場合 ・ウィンドウ及びメニューバーは表示されず test.iniを読み込むだけのプログラムになっている。 プログラム内容 ・test.cpp →コモンダイアログ「新規作成,名前を付けて保存,上書き保存」 ・アプリの終了 ・test.iniを読み込むソースコード ・resource.h →メニューID , test.iniを作成するためのID... ・compile.bat → test.cpp test.rc コンパイル.バッチファイル.. ・amsctl.ico → アイコン ・test.exe → アプリケーション ・test.map →ID定義 ソースコード関連.. ・test.rc →メニューバー定義 ・test.objなど →コンパイル時に作成されたプログラム ※ファイルを展開すれば ファイル内容及び ソースコードが分かるのですが  確認せずに!? 投稿ということは 大抵ファイルを展開していない 自分の予想として・・・とか  で投稿をしているのではないかぁと思います。 ※ファイルを展開して ファイル内容が分からないのにどうやって 確認するのですか?  この…がよく分かりません。 ・ただ単に 質問内容から理解する人がいますが 参考サイトやアップロードがされているというところ URL などに注目したらどうですか?

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>test.iniを書き込む ソースコードを書いて コンパイルリンクしたのですが test.exeを実行すると >test.iniが作成されないので なにかおかしいと思いましたが なにが原因ですか? コールされない関数を作ったこと…でしょうかね。 >bcc32 -W -w- test.cpp コンパイル成功 >brc32 test.rc コンパイルリンク成功 では int main() int ini() int createini() はコールされません。 スタートアップルーチンからコールされるのは int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) の方ですし。 # -WでWindowsアプリケーション指定しているんですから。 http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devwin32/bcc32_xml.html

RMCA
質問者

補足

bcc32 test.cpp brc32 test.rc でコンパイルリンクすると うまくできましたが test.exeを起動するとhellosと構成ファイルtest.iniに書き込まれている文字が読み込まれて コマンドが開き表示されたのですがこれだと test.iniのデーターを読み込んでコマンドで読み込むしかやっていない ということは ★★★簡単にいうと ウィンドウが開いて正常にメニューバーが表示されるのですが ウィンドウが現れず コマンドからtest.iniを読み込んでやっています。 この場合 どうすればいいのですか?★★★

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

ソースはまともに見ていません test.exe はどういったフォルダにおかれて実行しているのでしょうか? また 使っているOSは何なのでしょうか? Vista以降なら可能性として ・UAC要因によって VirtualStore に書き込みされている ・同じくUACと起動方法(特にスタートアップ登録した場合)の問題で  プログラム自体が動いていない などが考えられます VirtualStore について http://homepage2.nifty.com/nonnon/Chinamini/20100001/20101116.html

RMCA
質問者

補足

じゃあ ソースコードなどをみなくても分かりますか? どこの ソースコードが間違っているとか パスが共通していないとか ちゃんと確認すればするほど ソースコードが間違えているところも分かるのですが ◇c ini参照サイト:http://www.little-diary.net/archives/78/ [C++] .iniファイル 読み込み [WinAPI] ・.iniファイル作成から読み込んで出力まで参照 ◇ただ 単にコモンダイアログがある場所に .iniファイル作成から読み込んで出力までのソースコードをコピーして 貼り付けでコンパイルリンクしましたが何も問題 エラーはありません。 ★ソースコードを見直したのですが エラー箇所などありませんでした。 しかし ★詳しく見たりすると なにか分かるのではないかなぁーと思います ★test.exe を実行する為には まずbcc32 -W -w- test.cppでコンパイルし brc32 test.rcでコンパイルリンクします そうすると test.exeは できますが test.cppのプログラムには test.exeを実行後にtest.iniを作成するようになっていまのですがどうすればいいのですか?★ ※OSのバージョンとかではないかと思います。  ただたんに コピーをしただけでは なにかかたりないと思うときがありますが 今回は二台のパソコンで コンパイルを確認しましたが どちらとも OKでした。 ★★★やはり これはソースコードに問題があります。 ※アップロードサイトからzipに圧縮されているファイルを展開して ソースコードを確認してください。  そのソースコードが間違っている 可能性がございます。.... ★★★ bcc32 -W -w- test.cpp コンパイル成功 brc32 test.rc コンパイルリンク成功 ★回答よろしくお願いします...★

  • usami33
  • ベストアンサー率36% (808/2210)
回答No.1

もしかしたら、存在確認、読み込み、書き込みのそれぞれでパスを共通でしていしていないからではないでしょうか

RMCA
質問者

補足

★★★上にある アップロードされているzipをパスワード:1012 でダウンロードしてください。 アップロードされているファイルには ソースファイル「test.cpp test.rc~~」 などありますので それを確認した上で再度 アップロードしてもらってくれませんか? 自分はなかなかC++ 関係はよくわからないので もしよければ お願いします。★★★ >存在確認、読み込み、書き込みのそれぞれでパスを共通でしていしていないからではないでしょうか ということは どういうことですか? 単に,それぞれのパスを共通させるということですか? だとすると パスを共通するために ソースコードを変更しないといけなくなったりするので  パスを編集することは自分でいまいち理解していないので  もしよければ 編集した上でアップロードしてもらうませんか?

関連するQ&A

専門家に質問してみよう