2010-12-13 12 views
0

私は小さなテキストファイルを解析する方法(下記のコードが簡略化されたバージョンである)を有する:なぜこのコードでこの奇妙な動作が起こっていますか? Objective-Cの

- (void)parseFile:(NSString *)aFile 
{ 
    NSDate *date; 
    NSNumber *number; 
    NSString *desc; 

    NSString *txt = [NSString stringWithContentsOfFile:aFile encoding:NSUTF8StringEncoding error:nil]; 
    for (NSString *line in [txt componentsSeparatedByString:@"\n"]) { 
     if ([linesubstring isEqual:@"mydate"]) { 
     date = [dateFormat dateFromString:strDate]; 
     } 

     if ([linesubstring isEqual:@"mynumber"]) { 
     number = [numberFormat numberFromString:strValue]; 
     } 

     if ([linesubstring isEqual:@"mydesc"]) { 
     desc = [line substringWithRange:NSMakeRange(0, 10)]; 
     } 

     if (!date && !number && !desc) { 
     ...do something... 
     } 
    } 
} 

を第一の問題は、date変数がaFileパラメータの内容で満たされていることです。それは正しい値であると仮定します。

なぜですか?私はそのdateが予約語であってもそれを交換したが、同じ振る舞いであった。

2番目の問題は、最後のif(ネストされたもの)です。コードをデバッグの私は(この1つはエラーEXC_BAD_ACCESSをスロー)[number isNotEqualTo:[NSNull null]]のように、他の組み合わせを試してみました...

を、私はXcodeのは、「範囲外」としてそれを示して見ることができますが、!numberは(Xcodeのは、それが有効だと考えて)失敗します、成功なし。

お願いします。私はココア/客観的なcと初心者です。私はあなたが提供したコードと間違ってかなりの数のものがありますボブ

+2

ここに欠けているキーコードがあるようです。 linesubstring、strDate、strValueはどこに定義されていますか?また、文字列を比較するには 'isEqual'ではなく' [myString isEqualToString:otherString] 'を使用します。実際にコードで何をしようとしているのか分かりません。あなたのファイルから適切な変数型にテキストの行の内容を設定しようとしていますか?実際にテキストファイルに "mydate"と "mynumber"と "mydesc"がありますか? –

+0

おそらく私は多くのコードを単純化しました。 "linesubstring"はsubstringWithRangeの結果です。コードのこの部分が正しく機能しているので省略しました。 strDateとstrValueはフォーマッタです。私はまた省略した。はい。私が読もうとしているテキストファイルはCSVファイルの一種です。私は、行を読み、パターンを検索し、それを解析し、それを変数に格納します。 –

答えて

3

Javaから来て...

TIA、

です。あなたの変数宣言に関して

::これはコメントであるために十分なスペースがないので、私は答えボックスを使用してい

NSDate *date; 
NSNumber *number; 
NSString *desc; 

あなたがそれらを正しく宣言しているが、あなたは初期化されていませんそれら。彼らがそうであるように、彼らは任意のゴミを指している可能性があります。これはループ&hellipの最後のテストであることを意味します。

if (!date && !number && !desc) { 
    ...do something... 
} 

&hellipは; datenumberdescは常に非ゼロであってもよいので、実際には常に(それが実際に定義されていないので、私は、彼らがゼロまたは非ゼロであるかどうかかもしれを言う)実行することができます。あなたは、彼らが設定されているかどうかを判断することを計画している場合nilにそれらのそれぞれを初期化:例えば(変数を初期化することは必ずしも必要ではない

NSDate *date = nil; 
NSNumber *number = nil; 
NSString *desc = nil; 

、限り、あなたはそれから読む前にあなたがそれに書き込むように、それを初期化する必要はありません)。しかし、一部の人々は、この未定義の動作が浮上するのを防ぐためにすべての変数を初期化するという考え方を推進しています(初期化された値を上書きしても、

また、linesubstringという変数がありますが、コード内のどこにも宣言されていません。同様にstrDatestrValueもどこでも宣言されていません。同様にゴミを指しているかもしれないので、これらがどのように宣言され、どのように使われているかを知ることは重要です。

+0

私はなぜこれがコメントの価値があると思うか分かりません。私は、初期化の欠如はおそらく質問に記載されている症状の主な原因だと思う。とにかく、+1。 – JeremyP

関連する問題