iPhoneアプリ初作成中でファイルオープンで困

このQ&Aのポイント
  • ボタンを押したらファイルから文字列を読み込み、表示するサンプルアプリを作成中。
  • ビルド後にボタンを押しても何の反応もなく、ファイルのロケーションを変えても解決しない。
  • Xcode4でプロジェクトとテキストファイルのロケーションを設定しているが、なぜうまく動かないのかわからない。
回答を見る
  • ベストアンサー

iphoneアプリを初作成中でファイルオープンで困

ボタンを押したらファイルから文字列を読み込み、表示するサンプルアプリを作成しようとしております。(xcode4初コーディングです) しかし、ビルド後にボタンを押しても何の反応もありません。 ファイル(テキスト)のロケーションが違うのかと思いあちこち変えてもうまくいかず。何か私が根本的に間違っているような気がしてきました。 何がおかしいのかご教授願いますでしょうか。 xcode4 プロジェクトロケーション: デスクトップ>>sample テキストファイルロケーション: デスクトップ>>sample>>Resources>>text.txt テキストファイル中身: aiueo(形式はUTF-8) sampleViewController.m -(IBAction)userbutton:(id)sender{ self.label1.text = [NSString stringWithContentsOfFile:@"text.txt" encoding:NSUTF8StringEncoding error:&error]; です。ビルドは問題なくできているようです。 こんな質問の仕方でよいのかもわかりませんが、よろしくお願い致します。

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

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

ファイルを開くには、まずそのファイルのパスを指定しなければいけません。たんにファイル名(@"text.txt" )を指示しただけでは、アプリケーションは、どこにそのファイルがあるのかわかりませんよね? iOSでは、Mac OS Xにならって、UNIX流のファイルパスを記述します。ディレクトリをスラッシュ(/)で区切り、ルート(パスの起点)を「/」で表します。たとえば、デスクトップにある「hoge.txt」のパスは、 /Users/(username)/Desktop/hoge.txt となります。 アプリをiOSシミュレータで動かした場合と、iPhone実機で動かした場合、とうぜんながらファイルを保存する場所(ファイルパス)は変わります。実行環境が変わっても、適切にファイルパスを取得するための関数が、iOSには用意されています。 NSArray * NSSearchPathForDirectoriesInDomains ( NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde ); じっさいの使い方は、こちらのドキュメントに説明があります。 File System Programming Guide http://developer.apple.com/library/ios/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/Introduction/Introduction.html アプリが扱うファイルには2種類あり、ドキュメント(書類)とリソースに分かれます。ドキュメントはふつうに読み書きする書類ファイルのことですが、リソースは、たとえばボタンや背景の画像とか、タップしたときに鳴る音声とか、アプリを構成する一部となるファイルを指します。リソースは環境設定ファイル(plist)を除き、書き換え不可、読み込みのみの属性になります。 リソースはプロジェクトに「プロジェクトに追加...」することで取り込みます。Finder上でプロジェクトフォルダに移動しても、リソースにはなりません。 リソースファイルへのパスの取得には、NSBundleクラスを利用します。 NSBundle http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/ 「text.txt」をリソースとして扱う場合、パスはつぎのコードで取得します。 NSBundle *bndl = [NSBundle mainBundle]; NSString *filePath = [bndl pathForResource: @"text" ofType: @"txt"];

wakanobonti
質問者

お礼

解決致しました。原因はご指摘の通りパス間違いです。 そして解説を読んで、なぜみなさんがパスをクラスを使って指定しているのかわかりました。(パスなんてベタ打ちでいいのにとか思ってました) ご丁寧な回答ありがとうございました。 他に回答して下さいました方々もありがとうございました。

その他の回答 (1)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

デスクトップに置いてあるからじゃない? 基本的にiPhoneのアプリはアプリ内にデータが置いてないと読み取らないし読み取れないよ。 通常はアプリ内の Documents や Library に目的のファイルを保存(ダウンロード含む)してそれを open するやりかたになるよ。 シミュレータ上でやるならシミュレータ用のappがuserホーム下に有る筈だからそれを開いて Documents なりに目的のtxtを放り込んでそこから読む様にしたらできるんじゃないかな。

関連するQ&A

  • Objective C(iPhone SDK)でテキストファイルから一

    Objective C(iPhone SDK)でテキストファイルから一行毎データを読み出す方法を教えてください. つい最近Objective-Cを始めた初心者です. サーバ上にあるテキストファイルを読み込み,一行ごとデータを取り出し,その一行ずつ取り出したデータをTableViewの項目として表示したいと思っています.現在コンパイルが出来ているのは, NSString* text; NSString* path = @"(URL)test.txt"; NSError* error; text = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; までです.また,読み込むテキストファイルの内容は 0001 0002 0003 0004 [EOF] となっています.このデータの一行ずつを配列に格納する方法を教えてください,よろしくお願いします.

  • iPhoneアプリ開発 ファイル書き込み

    iPhoneアプリ開発につきまして、質問させて頂きます。 csvファイルへのデータの出力を試みているのですが上手くできません。 プログラムとログ内容を以下に記述しました。 「abc」と予め書いてある「hoge.csv」ファイルに「stringaaaaaaaaaaa」を書き込み保存しておきたいのですが、上手くいきません。 ログ内容を見る限り、「abc」が読み込めているので、パスは合っていると思っています。また、writeToFileをしてから読み込むと「stringaaaaaaaaaaa」が読み込めるため、どこかには書き込めているような気がします。 しかし、毎回同じ処理をしても、最初に読み込まれるのは「abc」です。「hoge.csv」をテキストエディタで読み込んでも表示されるのは「abc」です。 また、iPhoneシミュレーターで実行した結果は以下のログ内容なのですが、iPhone実機で動作させると、writeToFileを行ったあとでも「abc」が出力されます。 何か原因を思い当たる方、教えて頂ければ幸いです。 - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Stress Application"]; printf("viewdidload"); NSString *text = [[NSString alloc] initWithFormat:@"stringaaaaaaaaaaaaaaa"]; NSString *_path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"csv"]; //atomicallyは補助ファイルを使ってファイルの破損を防止するかどうか NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); [text writeToFile:_path atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); NSLog(@"%@",text); } <ログ内容> 2012-10-31 12:35:10.187 ThinkGearTouch[17182:1a903] FinishLaunching viewdidload2012-10-31 12:35:10.204 ThinkGearTouch[17182:1a903] abc 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa

  • Iphoneシミュレータでtxtファイルを作成する

    Iphoneシミュレータでtxtファイルを作成する 現在、Iphoneシミュレータ(3.1.3)上でプログラムを書いているのですがうまく動きません。 動作の内容はファイルを作成して、そこに文字列を書き込むだけです。 具体的にコードをはらせていただきますと、 NSArray* paths; NSString* path; paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); path = [paths objectAtIndex:0]; path = [path stringByAppendingPathComponent:@"text.txt"];   NSString *str = @"hello";   [str writeToFile:path atomically:YES encodidng:NSUTF8StringEncoding error:nil]; このようなコードを書いております。 コンパイルは正常に通るのですが、実行してみると最後のwriteToFileの行までくると強制的におちてしまいます。 どこがおかしいのでしょうか?ご指導よろしくおねがいします。

  • xcode iOSでのファイル操作について。

    知っている方、いましたらご教授お願いいたします。 ■現状 xCodeにてios7アプリを開発中で、ボタンが押下されたら テキストファイルへ文字列を保存するものを作っています。 しかしながら、なぜかテキストファイルへの保存がiosシュミレーター上で失敗してしまいます。 ソースコードは以下になります。 ■ソース NSString *homeDir; NSString *docDir; NSString *filePath; NSString *str; NSError *error; //Homeディレクトリのパス取得 homeDir=NSHomeDirectory(); //Documentsディレクトリのパス作成 docDir=[homeDir stringByAppendingPathComponent:@"Documents"]; //ファイルのパス作成 filePath=[docDir stringByAppendingPathComponent:@"test.txt"]; //ファイルのパスを表示 NSLog(filePath); //ファイルへの書き込み str=@"test¥ntest¥ntest"; //testを3行書く //[str writeToFile:filePath atomically:YES]; BOOL result = [str writeToFile:inSaveFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error]; if(result != YES) { NSLog(@"Error:%@", [error localizedDescription]); } ■エラー内容 error NSError * domain: @"NSCocoaErrorDomain" - code: 4 0x08dd4130 なにが悪いのかがさっぱり分からず困惑しています。 サンプルページなどでも構いませんので、ご教授のほどお願いいたします。 以上、よろしくお願いいたします。

  • iPhone アプリ開発で困っています。

    iPhone のアプリ開発をXcodeで行っていますが、viewに作ったTextFieldに入力された文字列を、同じview上の別のTextFieldに表示するということが出来ません。 下のリストで、ビルドをするとエラーにはならないのですが、シミュレーターで文字列を入力すると、別のTextFieldに文字列が表示されることなくプログラムが停止してアイコン画面に戻ってしまいます。(コメントにしている部分は、きちんと動きます。) 基本的なことが分かっていないのだと思いますが、いろいろな参考書を調べたり、ネットで検索しても分からないので、よろしくお願いします。 (myOutlet1 と myOutlet2 を、それぞれのTextFieldに接続しています。また、myAction1 をボタンにタッチアップインサイドで接続しています。) @implementation rensyuuViewController - (IBAction)myAction1:(id)sender { NSString *str = [myOutlet1 stringValue]; [myOutlet2 setText:[NSString stringWithFormat:@"%@",str]]; /* int a = [[myOutlet1 text] intValue]; a = a * 3; [myOutlet2 setText:[NSString stringWithFormat:@"%d",a]]; */ } @end

  • MacRubyでのファイル読み書きができません。

    MacRubyを利用してアプリを作っているのですが、ファイルの読み書きができず困っています。 DeployせずにXcode上で実行した時は全く問題なく読み書きできるのですが、Deployするとファイルへのアクセスができませんでした。 io = File.open("akarin.txt") akarin = io.read io.close akarin = NSString.stringWithContentsOfFile("akarin.txt", encoding:NSUTF8StringEncoding, error:error) akarin = `cat akarin.txt` AppDelegateクラスのinitializeで行なっています。 上記の3つの方法で試しましたがすべて無理でした。 上から2つはそもそも起動せず、一番下のは起動しても戻り値は akarin.to_s => "" でした。 書き込みもio.write、system("echo 'akarin' > akarin.txt")で試しましたが無理でした。 ファイルのアクセスにはどこかの設定でなにかの許可がいるのですか? どのように変更すればよいのか教えてください。

    • ベストアンサー
    • Ruby
  • objective-c テキストファイルのカウンタ

    ■環境:xcode4.2 ■iOS:5.1 DocumentDirectoryに保存した テキストデータを利用した、 カウンターを制作しようとしております。 現状、テキストファイルから数字を読み出し、 1数値を足して、上書き保存するカウンターを試していますが、 結果蓄積されるテキストファイルは「1」になって、 以降2 3 ~と増えずに、思った動作をしておりません。 私は経験が浅く基本的なところが間違えているかもしれません。 どなたか、こちらの具体的な解決方法を ご教示いただけますでしょうか? よろしくお願いいたします。 //カウント テキスト読み込み NSArray *pathcount = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *count_moto = [[pathcount objectAtIndex:0]stringByAppendingPathComponent:@"count.text"]; //カウント加算 int count = [count_moto intValue]; int countplus = count++; NSString *fixcount = [NSString stringWithFormat:@"%d",countplus]; //カウント テキスト書き込み [fixcount writeToFile:count_moto atomically:YES encoding:NSUTF8StringEncoding error:NULL];

  • locale::idとid型について

    objective-cでなんでも入れられるid型がありますが、cocos2dの環境下でc++から呼び出したいときにidにあう型がありません。一応std::local::idというのを見つけたのですが void DBClassBridge::updateColumn(string table, string field, locale::id input, string where, string target) { [DBClass_objc updateColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] input:(id)input //ここでエラー where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:[[[NSString alloc] initWithCString:target.c_str() encoding:NSUTF8StringEncoding] autorelease]]; } 以下のようなエラーが出ます。 Cannot convert 'locale::id' to 'id' without a conversion operator やはりデータ型があっていないっぽいです。 objective-cのid型にはどのデータ型を用いればいいのでしょうか?またはlocal::idからidへとどう変換すればいいのでしょうか? 知っている方、是非お願いします。

  • iPhoneのアプリ開発についてお伺い致します。

    Xcodeの実装をお伺いしたいのですが,あるアプリ開発の本を参考にして、クイズアプリをつくりました。クイズの問題、選択肢のデータファイルはテキストファイルでResourceに作成します。問題文をテキストビューに、選択肢をボタンに記載し、選択肢のボタンを押す事で回答させるシステムです。正解のボタンをタップすると、ボタンの文字の先頭に○を、不正解だと×を表示するのですが、これに、不正解時に正解のボタンの先頭に★等の印をつける為のソースコードをご教示いただければ幸いです。因に、テキストファイルには、1行目;問題文、2行目;正解の選択肢、3~5行目;不正解の選択肢、となっております。 //選択肢のボタンがタップされたときの処理 - (IBAction)answer:(id)sender { //正解か不正解かを見せる間、タップできない様に、ボタンを無効表示に変更する。 self.answerButton1.enabled = NO; self.answerButton2.enabled = NO; self.answerButton3.enabled = NO; self.answerButton4.enabled = NO; //タップされたボタンのラベルを取得する NSString *str = [[sender titleLabel] text]; //出題された問題の情報を取得する QuizItem *item = [self.quiz.usedQuizItems lastObject]; //正解か判定する if ([item checkIsRightAnswer:str]) { //正解なので、○を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"○ %@", str] forState:UIControlStateNormal]; //効果音を再生する AudioServicesPlaySystemSound(_rightSound); } else { //不正解なので×を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"× %@", str] forState:UIControlStateNormal]; }

    • 締切済み
    • Mac
  • iPhoneのアプリ開発についてお伺い致します。

    Xcodeの実装をお伺いしたいのですが,あるアプリ開発の本を参考にして、クイズアプリをつくりました。クイズの問題、選択肢のデータファイルはテキストファイルでResourceに作成します。問題文をテキストビューに、選択肢をボタンに記載し、選択肢のボタンを押す事で回答させるシステムです。正解のボタンをタップすると、ボタンの文字の先頭に○を、不正解だと×を表示するのですが、これに、不正解時に正解のボタンの先頭に★等の印をつける為のソースコードをご教示いただければ幸いです。因に、テキストファイルには、1行目;問題文、2行目;正解の選択肢、3~5行目;不正解の選択肢、となっております。 //選択肢のボタンがタップされたときの処理 - (IBAction)answer:(id)sender { //正解か不正解かを見せる間、タップできない様に、ボタンを無効表示に変更する。 self.answerButton1.enabled = NO; self.answerButton2.enabled = NO; self.answerButton3.enabled = NO; self.answerButton4.enabled = NO; //タップされたボタンのラベルを取得する NSString *str = [[sender titleLabel] text]; //出題された問題の情報を取得する QuizItem *item = [self.quiz.usedQuizItems lastObject]; //正解か判定する if ([item checkIsRightAnswer:str]) { //正解なので、○を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"○ %@", str] forState:UIControlStateNormal]; //効果音を再生する AudioServicesPlaySystemSound(_rightSound); } else { //不正解なので×を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"× %@", str] forState:UIControlStateNormal]; }

専門家に質問してみよう