ページ 11

指定のファイルがなかった場合、指定のファイルを自動作成する方法

Posted: 2010年7月04日(日) 02:27
by ぬるぽ
こんにちは。龍神録を改造して遊ばさせてもらってます。
例えばですが、ハイスコアを保存するときに
savedatというファイルの中にscore.datを生成して保存するとします。

//ハイスコアのセーブ
void hi_score_save(){
FILE *fp;
fp = fopen( "savedat/score.dat" , "wb" );
if( fp == NULL ) return;
fwrite( &HiScore, sizeof( HiScore ), 1, fp );
fclose( fp );
return;
}

保存時、savedatファイルがなかった場合、
自動でsavedatファイルを生成し、中にscore.datを生成して保存する
というようなプログラムに直したいのですが、
上記のプログラムをどのように修正、追加すればよいのか分からなくて困ってます。
どなたか分かる方がいましたら教えてください。よろしくお願いします。

Re:指定のファイルがなかった場合、指定のファイルを自動作成する方法

Posted: 2010年7月04日(日) 04:29
by めるぽん
この場合、savedat はファイルではなくフォルダもしくはディレクトリと呼びます。
フォルダ作成はC言語の範疇ではできなかった気がするので、
Windows なら _mkdir や CreateDirectory あたりを使えばいいと思います。

Re:指定のファイルがなかった場合、指定のファイルを自動作成する方法

Posted: 2010年7月04日(日) 04:31
by スキマ妖怪
竜神録ということですのでこういうのはどうでしょうか(^^;


#include <windows.h>
#include <shlwapi.h>
#pragma comment( lib, "shlwapi.lib" )

int main(int argc, char* argv[/url])
{
// フォルダの存在チェック
if( PathIsDirectory( "Hoge" ) )
{
// フォルダは存在する
}
else
{
// フォルダ作成
CreateDirectory( "Hoge", NULL );
}

return 0;
}


> savedatというファイルの中にscore.datを生成して保存するとします。

ファイルではなくて、フォルダ又はディレクトリの事ではないでしょうか…;
(本当にファイル(アーカイブとか?)の中に読み書きしたいのなら、上のコードではダメです…)

Re:指定のファイルがなかった場合、指定のファイルを自動作成する方法

Posted: 2010年7月04日(日) 18:29
by ぬるぽ
>>めるぽんさん
>savedat はファイルではなくフォルダもしくはディレクトリと呼びます
そうなのですか。
知らなかったので勉強になりました。ありがとうございます。

>>スキマ妖怪さん
試しに、龍神録50章で
どこかのcpp内にスキマ妖怪さんのおっしゃる

#include <windows.h>
#include <shlwapi.h>
#pragma comment( lib, "shlwapi.lib" )

int main(int argc, char* argv[/url]) {
// フォルダの存在チェック
if( PathIsDirectory( "Hoge" ) ) {
// フォルダは存在する
}
else {
// フォルダ作成
CreateDirectory( "Hoge", NULL );
}
return 0;
}

を追加し、function.h内に

GLOBAL int folder(int argc, char* argv[/url]);

を追加。main.cpp内のload後に

switch(func_state){
case 0: //初回のみ入る処理
load(); //データロード
int main(int argc, char* argv[/url]); //←追加
break;

を追加。
[プロジェクト]->[プロパティ]->[構成プロパティ]->[全般]の[文字セット]を
[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
にしてから実行してみると、エラーは出なかったのですが
Hogeというフォルダは作成できなかったです。
どこが原因で、どのようにしたら良いのでしょうか?

Re:指定のファイルがなかった場合、指定のファイルを自動作成する方法

Posted: 2010年7月04日(日) 18:56
by 通りすがり
C言語の基本が解っていないようです。
入門レベルの勉強を飛ばして上を望んでも壁にぶつかるばかりになることでしょう。
C言語の入門サイトでしっかりまずはC言語の基本を学んで下さい。

関数の呼び出し方が違うし、そもそもmainはやめましょう。

Re:指定のファイルがなかった場合、指定のファイルを自動作成する方法

Posted: 2010年7月04日(日) 19:08
by ぬるぽ
自己解決しました。

Re:指定のファイルがなかった場合、指定のファイルを自動作成する方法

Posted: 2010年7月04日(日) 19:30
by スキマ妖怪
自分が書かなかったのが悪いのですが、そのままコピペされると困ります…
かなり適当に書いてしまったので、細かいところを修正してもらわないとダメです;
(分かるかなと思ったのですが…)


なるべく分かりやすく書こうと思ったんですが、裏目になっちゃいましたね。

> CreateDirectory( "Hoge", NULL );
こう書くのならせめて

CreateDirectoryA( "Hoge", NULL );
とか
CreateDirectory( _T("Hoge"), NULL );
の方がよかったんですかね…


> switch(func_state){
> case 0: //初回のみ入る処理
> load(); //データロード
> int main(int argc, char* argv[/url]); //←追加
> break;

ちなみに、これは関数の呼び出しではなくて、宣言ですよ;(実行されませんよ)

main(0,0);

とりあえず、これで動くと思います。(コンソールのメイン関数なんで、適宜変更してください)

ユニコードなら文字列を「L"Hoge"」
マルチバイトなら「"Hoge"」
「#include "tchar.h"」をインクルードしているのなら「_T("Hoge")」
としてもらうといいかもしれません;


追記-----------------------------------------------------

だらだらと書いていたら、自己解決されたようで;
もっと早く書けるようにならないといけませんね…
画像