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で質問しましょう!
似たような質問が見つかりました
- Ruby MacBookAir起動時にRubyソースコードをコマンドラインで実行するには? MacのOS起動時 1 2022/04/18 01:55
- Mac OS 配信動画を見るのに、推奨環境に Mac OS 10.15、10.14と記載してあります。 私はmac 1 2022/09/18 14:37
- Mac OS mac os xの設定の(起動ディスク)にブート用dvdが表示されません 1 2022/05/28 13:29
- Mac OS 【MacOS】外付けHDDがUSB3.1バス上でのみアクセス出来なくなる 1 2022/10/29 10:27
- Windows 10 VirtualBox 7のゲストOSでの物理HDDパーティションのマウント方法 2 2023/05/04 13:01
- Mac OS El Capitanがインストールできない… 1 2023/06/16 13:05
- Word(ワード) MacのOSをアップデートしたら、Wordが使用できなくなりました。 2015年年末に頃にMacとM 2 2022/05/15 12:39
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Mac OS macを再インストールしたら、オフィス365が使えない…。os11以上にできません。 1 2023/08/27 22:59
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
init関数の意味
-
fopne で失敗する原因
-
ハンドルはポインタか
-
Run-Time Check Failure #3とい...
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
アプリを32bitから64bit移行
-
VBはCを混乱させる?
-
プログラミングのfarについて
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
コンストラクタでnewを失敗した...
-
入れ子の構造体について
-
[excel vba] マウスポインタの...
-
VB6でのgethostbyaddrの使用方...
-
エラーの意味
-
デバイスハンドルとは?
-
ExcelVBAでのkernel32(64bit)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
セグメントエラー
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
DLL<->VB間での受け渡し(文字...
-
C言語でのconstを返す関数
-
ポインタについて
-
参照型で受け取った引数をポイ...
-
TCHAR文字列内の検索について
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
おすすめ情報