No.3ベストアンサー
- 回答日時:
>当方で、コードを差し替えてみたのですが、warningがとれず調べてみました。
すみません、私もミスってました。
encodingに定数を渡していたので、名前が似ている「+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error」と取り違えてしまいました。
無駄な調べものをさせてしまいました。お詫びします。
気を取り直して^^;
改めて、ワーニングについて補足させて下さい。
xcode_15 さんもお気づきの通り、NSUTF8StringEncodingは(変数ではなく)定数です。
メソッドが要求しているのはポインタなので、変数のアドレスを渡す必要があります。
従って、以下の様にすれば動作すると思います。
NSStringEncoding encoding; // エンコーディングを返してもらうための変数を定義
lineData_ = [NSString stringWithContentsOfFile:fullPathStr
usedEncoding:&encoding // 変数のアドレスを渡す。変数にはエンコーディングの値が返ってくる
error:&error // こっちは、ポインタ変数のアドレスを渡す。変数にはポインタの値となるアドレスが返ってくる
];
今回もコンパイルチェックしてないので、ミスってるかもしれないですが、その前提でご容赦ください。
蛇足ですが、コードを見ていて気になったところがありました。
>NSArray *lines = [[NSString stringWithContentsOfFile:fullPathStr]
componentsSeparatedByString:@"\n"];
>NSLog(@"lines = %@\n", lines);
%@に対してNSArrayのインスタンスを渡していますが、意図通りですか?(その下のNSEnumeratorも)
ありがとうございました。
やっと、ファイルから文字列を取り出す事が出来ました。
引数に、値を渡してやる物だと思いこんでいたのですが、まさか、戻ってくるとはねぇ。意外でした。
C言語の関数でも、余りやらない手法をやってくれるなんて (*o*)
しかし、こうも似通った名前が並んでいると、チョイスするのに骨折りそうです。
ご指摘のあったNSLogの「%@」は、NSStringのインスタンスを渡さないといけないのですが、間違ってました。
有り難うございます。
No.2
- 回答日時:
>lineData_ = [NSString stringWithContentsOfFile:fullPathStr usedEncoding:(NSStringEncoding *)NSUTF8StringEncoding error:(NSError **)error];
この行に問題があります。
error:の引数に渡すのはNSError** 型ですが、xcode_15さんが渡している変数errorは、上の方でNSError *error;と定義されています。
NSError*型の変数なのに、無理矢理NSError**型にキャストして渡しているために、不正メモリアクセスが発生して落ちているのでしょう。
また、その前の引数もキャストされていますが、メソッドが受け付けるのはポインタではないので、このキャストは必要ないです。というか、してはいけないです。
ただし、こちらのキャスト自体は今回の問題の原因にはなっていないと思います。
コンパイルエラーを黙らせるために闇雲にキャストすると、このような問題が発生しやすいです。やむを得ずキャストする場合は、変数の型の意味と、そこに何が入るのかを十分に理解して行う必要があります。
少なくとも今回のプログラムでキャストが必要なところは無いですよ。
エラーチェックはしてないですが、下ので試してみて下さい。
lineData_ = [NSString stringWithContentsOfFile:fullPathStr usedEncoding:NSUTF8StringEncoding error:&error];
重ねてご回答を戴きまして、誠に有り難うございます。
当方で、コードを差し替えてみたのですが、warningがとれず調べてみました。
warning: passing argument 2 of 'stringWithContentsOfFile:usedEncoding:error:' makes pointer from integer without a cast
「NSString Class Reference」より
+ (id)stringWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
このNSStringEncodingの中身は、eumでした。
結論からすると、当方の力不足で在りますが、コンパイルエラーを黙らせる事が出来ませんでした。
大変申し訳ありませんが、例文を書いて頂けないでしょうか? (-人-)
No.1
- 回答日時:
これによると、「stringWithContentsOfFile:encoding:error:」は10.4から使えることになっています。逆に10.3以前の環境では使えません。
10.4以降Deprecatedになっているのは、エンコーディング指定の出来ない「stringWithContentsOfFile:」の方ですね。
なので、xcode_15さんの使われているメソッドは、10.4以降を対象にする限りはそのまま使っていて大丈夫です。
>ちなみに、cocoaアプリでは動きますが、コマンドラインではこけてしまいます。
具体的にどのような現象になりますか?
ログやNSErrorの返す内容を出してもらえると何か分かるかもしれません。
また、コマンドラインで不都合が発生する場合、autorelease pool をつくってやるのを忘れている事が多いです。ここも確認してみてください。
ご回答を戴き、有り難うございます。
> 具体的にどのような現象になりますか?
デバッグモードでステップ実行をしていて、「stringWithContentsOfFile:」を実行した直後にアセンブルコードを表示して戻ってきません。
Cocoa初心者ですので、トンチンカンな質問をしているかもしれませんので、コードを書いておきます。
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *csvdata;
intans;
MyFiles *object = [[MyFiles alloc] init];
ans = [object readCsvData:@"~/src/data/test225.csv"];
NSLog(@"csvdata = %@", csvdata);
[object release];
[pool drain];
return 0;
}
@interface MyFiles : NSObject {
NSString*lineData_;
}
-(int)readCsvData:(NSString*)fileName;
@end
@implementation MyFiles
//ファイル名から、ファイルを読み込む
-(int)readCsvData:(NSString*)fileName {
NSError*error;
NSArray*dirArray;
//ディレクトリの中身を調べる
//---------------------------------
dirArray = [[NSFileManager defaultManager] directoryContentsAtPath:fileName];
NSLog([dirArray description]);
//---------------------------------
NSString* fullPathStr = [fileName stringByExpandingTildeInPath];//フルパスを、取得する。
lineData_ = [NSString stringWithContentsOfFile:fullPathStr
usedEncoding:(NSStringEncoding *)NSUTF8StringEncoding
error:(NSError **)error];
NSLog(@"_lineData = %@\n", _lineData);
NSArray *lines = [[NSString stringWithContentsOfFile:fullPathStr]
componentsSeparatedByString:@"\n"];
NSLog(@"lines = %@\n", lines);
NSEnumerator *nse = [lines objectEnumerator];
NSLog(@"nse = %@\n", nse);
return 0;
}
@end
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
ハンドルはポインタか
-
DelphiでCreateProcessがうまく...
-
オーバーロードされたメンバ関...
-
ポインタ引数をさらにポインタ...
-
init関数の意味
-
C言語での`void**`の意味
-
C言語のポインタに直接アドレス...
-
C++配列の型に関するC++規格に...
-
VC++でmciSendString
-
B-reps(境界表現)をC、C++で...
-
C++とWIN32APIとゲームプログラ...
-
nullの概念
-
基本アルゴリズムの『返す』の...
-
#include <stdio.h> int main(v...
-
構造体メンバがポインタである...
-
仮引数の変数をローカル変数に...
-
関数の引数をvoid*でキャストする
-
ファイルポインタ
-
C言語の習得度別お勧め参考書
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
init関数の意味
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
C言語でのconstを返す関数
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
PASCALとFARの意味
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
デバイスハンドルとは?
-
C言語の文字列?処理 strcpyやl...
-
ポインタのミスでOS壊れるの...
-
C++ vectorのbeginについて
-
基本アルゴリズムの『返す』の...
おすすめ情報