1. ホーム
  2. objective-c

[解決済み] Objective-C。ファイルを一行ずつ読む

2022-05-29 01:17:26

質問

Objective-Cで大きなテキストファイルを扱うには、どのような方法が適切でしょうか。例えば、各行を別々に読む必要があり、各行をNSStringとして扱いたいとします。これを行うための最も効率的な方法は何ですか?

1つの解決策は、NSStringメソッドを使用することです。

+ (id)stringWithContentsOfFile:(NSString *)path 
      encoding:(NSStringEncoding)enc 
      error:(NSError **)error 

という配列を作って、改行区切りで行を分割し、その配列の要素に対して反復処理を行います。しかし、これはかなり非効率的なようです。ファイルをストリームとして扱い、一度にすべてを読み込むのではなく、各行を列挙する簡単な方法はないのでしょうか?Java の java.io.BufferedReader のようなものです。

どのように解決するのですか?

いい質問ですね。私が思うに @Diederik は良い答えを持っていると思います。しかし、Cocoa がまさにあなたがやりたいことのためのメカニズムを持っていないのは残念です。

NSInputStream は,N バイトのチャンクを読み取ることができます (これは java.io.BufferedReader と非常によく似ています)、しかし、あなたはそれを NSString に変換し、改行 (あるいは他の区切り文字) をスキャンして残りの文字を次の読み込みのために保存するか、改行がまだ読み込まれていない場合はさらに文字を読み込む必要があります。( NSFileHandle を読むことができます。 NSData に変換し、それを NSString に変換することができますが、基本的には同じ処理です)。

アップルは ストリーム プログラミング ガイド があり、詳細を説明するのに役立ちます。 このSOの質問 を処理する場合にも役立つかもしれません。 uint8_t* バッファを扱うのであれば、役に立つかもしれません。

このような文字列を頻繁に読み込むのであれば(特にプログラムの別の部分で)、この動作を詳細を処理できるクラスでカプセル化するのが良いでしょうし、サブクラスで NSInputStream (それは はサブクラス化されるように設計されています のサブクラスとして設計されています)、正確に読み取ることができるメソッドを追加しています。

念のために言っておきますが、これは追加すべき素晴らしい機能だと思いますし、これを可能にする何かのために強化要求を提出するつもりです :-)


編集します。 この要求はすでに存在することが判明しました。このための 2006 年の Radar があります (Apple 内部の人は rdar://4742914)。