Androidでのファイル出力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Rom
記事: 25
登録日時: 13年前
住所: 日本

Androidでのファイル出力

#1

投稿記事 by Rom » 12年前

ゲームのハイスコアをバイナリで保存したいのですがわかりません
以下が現在のコードです。file.mkdirs()がうまくいっていないようです

コード:

private void SaveFile(){
		
		if(sdcardWriteReady()==true){
			File file = new File(Environment.getExternalStorageDirectory().getPath()+"/test/");       //SDカードのディレクトリを取得してこのゲーム用の分追加
			boolean s = file.exists();                                                                                            //このをEnvironment.getExternalStorageDirectory().getPath()+"/test/save.dat"としてもだめだった
			 try{  
				if(s==false){  
				file.mkdirs();
				}  
			}catch(SecurityException e){
			
			} 
			s = file.exists();                   //デバッグでみるとこの時点でs=falseなのでmkdirsがうまくいっていないのかも?
			String AttachName = file.getAbsolutePath() + "/save.dat";
			File saveFile = new File(AttachName); 
			try {
				FileOutputStream out = new FileOutputStream(saveFile);                  //ここで例外が出てeraa=100000000まで飛んでるぽい→ディレクトリがないから?
				out.write((byte)(save.highscore+(int)(save.highrate*1000)));           //このやり方はあっているのか
				out.close();
				} catch (IOException e) {
					int eraa = 100000000;
			}
			
		}
		
}
private boolean sdcardWriteReady(){  	//SDを使用可能ならTRUE
		 String state = Environment.getExternalStorageState();  
		 return (Environment.MEDIA_MOUNTED.equals(state));  
}
ようはC/C++での以下のことをやりたいのです

コード:

//ハイスコアなどを保存した構造体"save_data型のsave"があったとして
FILE* pFile;
if((pFile = fopen( "save.dat", "wb" ))==NULL){
				throw(-1);
}else{
fwrite( &save, sizeof(save_data), 1, pFile );
fclose(pFile);
}
よろしくお願いします

参考にしたサイト:素人のAndroid開発日記

non
記事: 1097
登録日時: 13年前

Re: Androidでのファイル出力

#2

投稿記事 by non » 12年前

保存先はSDでしょうか?
パーミッションは設定してますか?
http://www.ipentec.com/document/documen ... ture=ja-jp
non

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: Androidでのファイル出力

#3

投稿記事 by bitter_fox » 12年前

Rom さんが書きました:ゲームのハイスコアをバイナリで保存したいのですがわかりません

コード:

				out.write((byte)(save.highscore+(int)(save.highrate*1000)));           //このやり方はあっているのか

コード:

fwrite( &save, sizeof(save_data), 1, pFile );
上と下だと同じ結果にならないですよ。
下だとsave_dataのデータを書き出してますけど、上だとhighscoreにhighrateを1000倍してintの範囲に丸めたものを足して、それをさらにbyteの範囲に落としたものを出力しています。
なので出力されるのは-128~127までの値になりますが、意図したとおりでしょうか?

内部データを出力するときはシリアライズすればかなり楽ですよ

Rom
記事: 25
登録日時: 13年前
住所: 日本

Re: Androidでのファイル出力

#4

投稿記事 by Rom » 12年前

nonさん

ご指摘の通りです
パーミッションを設定していませんでした

bitter_foxさん

シリアライズというものを使うことで無事やりたいことができました


お二方ともどうもありがとうございました
一応できたものを載せておきます

コード:

private void SaveFile(){
        
        if(sdcardWriteReady()==true){
			File file = new File(Environment.getExternalStorageDirectory().getPath()+"/test/");
			boolean s = file.exists();
			 try{  
				if(s==false){  
				file.mkdirs();
				}  
			}catch(SecurityException e){
			} 
			String AttachName = file.getAbsolutePath()+"/save.dat";
			File saveFile = new File(AttachName); 
			try {
				FileOutputStream out = new FileOutputStream(saveFile);
				ObjectOutputStream outObject = new ObjectOutputStream(out);
				outObject.writeObject(save);
				outObject.close();
				out.close();
				} catch (IOException e) {
			}
			
		}
        
}
private boolean sdcardWriteReady(){     //SDを使用可能ならTRUE
         String state = Environment.getExternalStorageState();  
         return (Environment.MEDIA_MOUNTED.equals(state));  
}

コード:

/////////////////////読み込み部分/////////////////////////
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/test/save.dat");
	    boolean s = file.exists();

	    if(file.exists()==true){    		
			try{
				FileInputStream inFile;
				inFile = new FileInputStream(file.getAbsolutePath());
				ObjectInputStream inObject = new ObjectInputStream(inFile);
				save = (save_data)inObject.readObject();
				inObject.close();
				inFile.close();
				
			}catch(IOException e){	
				int a=0;
			} catch (ClassNotFoundException e) {
				int b=0;
			}
			
    	}

閉鎖

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