ページ 11

読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 15:20
by bonbo
連日トピックを立ててしまい申し訳ありません。
以下のコードで読み込みたいapple.testというファイルがあるのですが
そのファイルをiPhoneの中に書き込む方法が分からず困っています。
どうすればよいのでしょうか。

(書き込みたい
→書き込むファイルを読み込みたい
→書き込むファイルがiphoneの中にはない
→読み込めない
→そのため、fwrite以外の方法でiphoneの中にファイルを書き込みたい。)

コード:

int Load(){
    FILE *fp;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"apple.test"];                          // apple.testを読み込みたい
    NSLog(@"path:%@",path);
    fp = fopen([path cStringUsingEncoding:1],"rb");                   // 当然ファイルは存在しないのでfp==NULLとなってしまう。
    if(fp==NULL){
        fclose( fp ) ;
        NSLog(@"failed1");
        return -1;
    }
//
//読み込み処理
//
    fclose( fp ) ;
    NSLog(@"ここまできた");
    return 0;
}
環境は
Xcode4.4,iPhone4Sです

分かりづらい文章で申し訳ありません。よろしくおねがいします。

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 15:37
by softya(ソフト屋)
iPhoneはよく知りませんが、fopenの仕様は調べましたか?
そして"rb"の意味は理解できていますでしょうか?
「Man page of FOPEN」
http://linuxjm.sourceforge.jp/html/LDP_ ... pen.3.html

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 18:55
by bonbo
>softyaさん
ありがとうございます。
"rb"は確か
バイナリモードで書き込み。ですよね。
バイナリモードとは改行などのエスケープシーケンスを無視して書き込むモード…ではないでしょうか。
>fopenの仕様
やっぱり環境によって変わってくるものなのでしょうか…
ディレクトリの指定の方法が変わったけど同じ関数だと思っていました。
fopen Xcodeで検索しても特別おかしな情報は出てきませんでしたが…

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 18:58
by softya(ソフト屋)
>"rb"は確かバイナリモードで書き込み。ですよね。

いえ。すごく素直に作られているので、そういう誤解が入るとは思いませんでした。
r ・・・ read
b ・・・ binary
です。

>やっぱり環境によって変わってくるものなのでしょうか…

C言語の基本仕様の部分は変わりませんよ。

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 19:00
by bonbo
見間違えました…お恥ずかしい…
wbがwrite binaryです…

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 19:03
by softya(ソフト屋)
そうです。"wb"でオープンしてfwriteすればファイルが出来上がります。
ただ、質問で分からないところがあって、存在しないファイルを読み取りたいと言っているようにも受け取れるのですが。

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 19:17
by bonbo
>fopen
正直理解しないまま便利な関数として使っていましたからもやもやしています。
明日東京に行くので書籍あさってみます。
>ただ、質問で分からないところがあって、存在しないファイルを読み取りたいと言っているようにも受け取れるのですが。
へたな文章で申し訳ありません…確かにそうですね。

今の問題は
 「windowsで作ったデータを別環境で読み取る方法がよくわからないこと」
なのです。

iPhoneの中にあるデータを読み込む方法はわかっているのですが、
( http://dixq.net/forum/viewtopic.php?f=3&t=12638 ここで解決しました。)
リソースとして添付させたファイルを読み込む方法はわからないので、その作ったデータを添付させても、
読み込むことができないのです。

分かりづらいですね…

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 19:22
by softya(ソフト屋)
私はiPhone環境独特の部分は分からないです。
iPhoneアプリのリソースとして添付したテキストファイルが読めないので困っているって事でよろしいでしょうか?

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 19:39
by bonbo
>iPhoneアプリのリソースとして添付したテキストファイルが読めないので困っているって事でよろしいでしょうか?
はい。そうです。形式は.txtではないですが。

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 19:42
by h2so5
答えは既に出ていますよ。
h2so5 さんが書きました: iOSではアプリから書き込めるディレクトリが制限されています。

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 19:43
by softya(ソフト屋)
MacもiPhoneも無いので確認できないですが、次のようなものではなにでしょうか?
「列挙し、iPhone アプリのリソースの読み込み方法」
http://ja.softuses.com/114678
と言うことでNSBundleを調べられたほうが良いかなって思います。

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 22:05
by bonbo
気づいたのですが、

コード:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"apple.test"];                          // apple.testを読み込みたい
このコードで読み込めるのは、アプリで書き込んだファイルのみですね。
これでは読み込めません。
となると、付属できるファイルはpngの画像ファイルだけ…そんなことないですよね…

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 22:06
by bonbo
>softyaさん
ありがとうございます。
NSBundleだと実機に移したときに読み込めないみたいなのです…ありがとうございます。
>h2so5さん
ありがとうございます。
>iOSではアプリから書き込めるディレクトリが制限されています。
書き込みはできない。ということでしょうか…

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 22:16
by h2so5
書きこむディレクトリが制限されているとは言いましたが、読み込みが制限されているとは言っていません。

そもそも、読み込みができないならなぜこのトピックの投稿でNSLogによる結果が表示されているのでしょうか?
コードではfopenに失敗したらreturnするようになっているので、読み込みができないなら内容が表示されないはずです。

http://dixq.net/forum/viewtopic.php?f=3&t=12638
bonbo さんが書きました: NSLogで
0
1
2
3
4
5
6
7
8
9
と表示されると期待しているが
0
5
4
0
19
0
0
0
0
0
と表示されてしまう
というのが現状です。
bonbo さんが書きました:

コード:

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;
}

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月06日(水) 22:17
by softya(ソフト屋)
今までの話からNSSearchPathForDirectoriesInDomainsで得られるパスは読み書きできるはずです。
NSBundle の方は読み込みしか出来ないですが、NSSearchPathForDirectoriesInDomainsパスに内容をコピーすれば読み書き可能になりますよね。

>NSBundleだと実機に移したときに読み込めないみたいなのです…ありがとうございます。

それは、なぜそう思ったのですか?

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月07日(木) 06:42
by bonbo
返信が遅れて申し訳ありません。
できました。
一応できたコードを貼っておきます。
http://www1.axfc.net/uploader/so/2820025
>h2so5さん
>書きこむディレクトリが制限されているとは言いましたが、読み込みが制限されているとは言っていません。
もう一度試してみたらできました。すみません…

>softyaさん
>それは、なぜそう思ったのですか?
勘違いでした…すみません…以前
http://www1.axfc.net/uploader/so/2817054
にアップロードしたソースコードでは動いていないと思うのですが、今回のでは動いています。

あと、うまく読み込めていなかった原因が分かりました。
読み込みもwindowsで作ったコードを流用していたのですが、

コード:

fread(&skip_Flag,sizeof(BOOL),1,fp);
これを

コード:

fread(&skip_Flag,sizeof(int),1,fp);
こう直したらうまくいくようになりました。(skip_Flagはwindows環境下のBOOL型で保存してあります。)
BOOLのサイズが環境によって違う?バグ…ではないですよね。
腑に落ちない部分もありますが、とりあえず読み込みに関しては解決しました。

何度もありがとうございました。

Re: 読み込むファイルをiPhoneの中に書き込みたい

Posted: 2013年3月07日(木) 07:07
by h2so5
bonbo さんが書きました: こう直したらうまくいくようになりました。(skip_Flagはwindows環境下のBOOL型で保存してあります。)
BOOLのサイズが環境によって違う?バグ…ではないですよね。
C言語にBOOL型はありません。
Winodws環境とiOS環境で、たまたま同じ名前でBOOLという型が定義されているだけです。

Windows環境では int, iOSでは signed char と等価です。