ページ 11

Xcode,fread,実機で読み込むとおかしな値になる

Posted: 2013年3月04日(月) 23:07
by bonbo
以下のコードを実行したとき、シュミレータではうまくいくのですが
実機(iphone4S)での動作がおかしくなってしまいます。どこがいけないのでしょうか。
保存するオブジェクト

コード:

int high[10];//グローバル変数の配列
保存、読み込みの関数

コード:

int Write(){
	FILE *fp;
    NSString*path=[[NSBundle mainBundle]pathForResource:@"test2" ofType:@"test"];
    NSLog(@"path:%@",path);
    fp = fopen([path cStringUsingEncoding:1],"wb");
	if(fp==NULL){
		fclose( fp ) ;
        NSLog(@"failed1");
		return -1;
	}
    for(int i=0;i<10;i++)
        fwrite(&high[i], sizeof(int), 1, fp);
	fclose( fp ) ;
    
	return 0;
}
int Load(){
	FILE *fp;
    NSString*path=[[NSBundle mainBundle]pathForResource:@"test2" ofType:@"test"];
    NSLog(@"path:%@",path);
    fp = fopen([path cStringUsingEncoding:1],"rb");
	if(fp==NULL){
		fclose( fp ) ;
        NSLog(@"failed1");
		return -1;
	}
    for(int i=0;i<10;i++)
        fread(&high[i], sizeof(int), 1, fp);
	fclose( fp ) ;
    NSLog(@"ここまできた");
	return 0;
}
メインのソースコード

コード:

    for (int i=0; i<10; i++) {//それぞれ0,1,2,3...と代入していく
        high[i]=i;
    }
    Write();//high[10]を保存する。
    for (int i=0; i<10; i++) {//high[10]を初期化
        high[i]=0;
    }
    Load();//保存したhigh[10]から読み込む。
    for (int i=0; i<10; i++)
        NSLog(@"high[%d]=%d",i,high[i]);
環境はXcode4.4,iPhoneシュミレータ5.1(うまくいく)
iPhone4S(うまくいかない)
最近こんな症状にお世話になった気がするのですが…また2byte文字の問題でしょうか…

一応ソースコードをアップロードしておきます。
EAGLView.mm内に記述してあります。
http://www1.axfc.net/uploader/so/2817054

分かりにくい質問で申し訳ありません。
よろしくお願いします。

Re: Xcode,fread,実機で読み込むとおかしな値になる

Posted: 2013年3月04日(月) 23:12
by box
bonbo さんが書きました:以下のコードを実行したとき、シュミレータではうまくいくのですが
実機(iphone4S)での動作がおかしくなってしまいます。どこがいけないのでしょうか。
何をもって「うまくいかない」と判断されているのでしょうか。
これこれのデータを書き込んだつもりで、本来はこれこれこうなるはずが
実際にはこれこれこうなっているので「うまくいかない」と判断した、という具体例の
提示が必要ではないか、と思います。

シュミレータ:たぶん、シミュレータ(英語のつづりはsimulator)が正しいでしょう。

Re: Xcode,fread,実機で読み込むとおかしな値になる

Posted: 2013年3月04日(月) 23:21
by bonbo
>boxさん
ありがとうございます。
>何をもって「うまくいかない」と判断されているのでしょうか。
すみません,説明不足でした。
NSLogで
0
1
2
3
4
5
6
7
8
9
と表示されると期待しているが
0
5
4
0
19
0
0
0
0
0
と表示されてしまう
というのが現状です。
>シュミレータ:たぶん、シミュレータ(英語のつづりはsimulator)が正しいでしょう。
ご指摘ありがとうございます。今度から英語で書くようにします。

Re: Xcode,fread,実機で読み込むとおかしな値になる

Posted: 2013年3月05日(火) 22:31
by h2so5
標準出力を見れば分かりますが、”failed1”と表示されるのでまず書き込みの時点で失敗しています。
iOSではアプリから書き込めるディレクトリが制限されています。

基本的にはドキュメントディレクトリに書き込み用のファイルを配置するので、このようにファイルパスを取得します。

コード:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test2.test"];
http://stackoverflow.com/questions/5619 ... ile-on-ios

Re: Xcode,fread,実機で読み込むとおかしな値になる

Posted: 2013年3月06日(水) 05:50
by bonbo
>h2so5さん
ありがとうございます。
>標準出力を見れば分かりますが、”failed1”と表示されるのでまず書き込みの時点で失敗しています。
すみません、見落としていました。本当ですね。

>基本的にはドキュメントディレクトリに書き込み用のファイルを配置するので、このようにファイルパスを取得します。
>iOSではアプリから書き込めるディレクトリが制限されています。
できました。すごい…

一応書き換えたコードをのせておきます。h2so5さんのコードを付け加えただけですが。

コード:

int Write(){
    FILE *fp;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test2.test"];
    NSLog(@"path:%@",path);
    fp = fopen([path cStringUsingEncoding:1],"wb");
    if(fp==NULL){
        fclose( fp ) ;
        NSLog(@"failed1");
        return -1;
    }
    for(int i=0;i<10;i++)
        fwrite(&high[i], sizeof(int), 1, fp);
    fclose( fp ) ;
    
    return 0;
}
int Load(){
    FILE *fp;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test2.test"];
    NSLog(@"path:%@",path);
    fp = fopen([path cStringUsingEncoding:1],"rb");
    if(fp==NULL){
        fclose( fp ) ;
        NSLog(@"failed1");
        return -1;
    }
    for(int i=0;i<10;i++)
        fread(&high[i], sizeof(int), 1, fp);
    fclose( fp ) ;
    NSLog(@"ここまできた");
    return 0;
}
ありがとうございました。