1

行ごとではなく、txtファイルの内容全体を読み込もうとしていますが、内容全体を読み込もうとしています

xcodeのテキストフィールド内の画面に印刷します

私はobj-cとc ++言語を組み合わせて使用​​しています:

while(fgets(buff, sizeof(buff), in)!=NULL){
        cout << buff;  // this print the whole output in the console


         NSString * string = [ NSString stringWithUTF8String:buff ] ;

         [Data setStringValue:string]; // but this line only print last line inside the textfield instead of printing it all
    }

次のようなファイルの内容全体を印刷しようとしています:

  1. なにか...
  2. なにか...
  3. 等...

代わりに、最後の行をテキストフィールドに出力するだけです。助けてください

4

3 に答える 3

2

Obj-C を使用してファイルを読み取らない理由はありますか? それは次のように簡単です:

NSData *d = [NSData dataWithContentsOfFile:filename];
NSString *s = [[[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding] autorelease];
[Data setStringValue:s];

編集:あなたが今持っているコードを使用するには、次のようなことを試します:

while(fgets(buff, sizeof(buff), in)!=NULL){
  NSMutableString *s = [[Data stringValue] mutableCopy];
  [s appendString:[NSString stringWithUTF8String:buff]];
  [Data setStringValue:s];
 }
于 2012-12-21T21:39:01.030 に答える
1

ファイルを読み取り、コンテンツを C++ 文字列として返します。

  // open the file
  std::ifstream is; 
  is.open(fn.c_str(), std::ios::binary);

  // put the content in a C++ string
  std::string str((std::istreambuf_iterator<char>(is)),
                   std::istreambuf_iterator<char>());

あなたのコードでは、C api ( FILE*cstdio から) を使用しています。C では、コードはより複雑になります。

char * buffer = 0; // to be filled with the entire content of the file
long length;
FILE * f = fopen (filename, "rb");

if (f) // if the file was correctly opened
{
  fseek (f, 0, SEEK_END);  // seek to the end
  length = ftell (f);      // get the length of the file
  fseek (f, 0, SEEK_SET);  // seek back to the beginning
  buffer = malloc (length); // allocate a buffer of the correct size
  if (buffer)               // if allocation succeed
  {
    fread (buffer, 1, length, f);  // read 'length' octets
  }
  fclose (f); // close the file
}
于 2012-12-21T21:36:58.143 に答える
0

ソリューションが機能しなかった理由の質問に答えるには:

[Data setStringValue:string]; // but this line only print last line inside the textfield instead of printing it all

Dataそれがテキスト フィールドを参照すると仮定するとsetStringValue:、フィールドの内容全体が渡された文字列に置き換えられます。ループは一度に 1 行ずつ読み取って設定するため、常にstringファイルから 1 行になります。

ビューは、メイン スレッドで他に何もしていないときにのみ表示するように指示されるため、別のスレッドまたはキューでループを実行していないと仮定すると、ループは一度に 1 行ずつ出力されません。各行を読み取り、テキスト フィールドの内容をその行に置き換えるため、ループが終了すると、最後に設定したものstringValue(ファイルの最後の行) がフィールドに残ります。

ファイル全体を一度に丸呑みすることはできますが、いくつかの問題が残っています:

  • テキスト フィールドは、複数行を表示するためのものではありません。ファイルをどのように読んでも、そのコンテンツ用に設計されていない場所にそのコンテンツを配置していることになります。
  • ファイルが十分に大きい場合、読み取りにはかなりの時間がかかります。メイン スレッドでこれを行うと、その間、アプリはハングします。

適切な解決策は次のとおりです。

  1. テキスト フィールドではなく、テキスト ビューを使用します。テキスト ビューは、任意の行数のテキストで動作するように構築されており、ペン先でテキスト ビューを作成すると、無料でスクロール ビューにラップされます。
  2. ファイルを一度に 1 行またはその他の制限されたサイズのチャンクで読み取りますが、forまたはwhileループではありません。NSFileHandle または を使用dispatch_sourceします。どちらも、ファイルの別のチャンクを読み取るたびに、指定したブロックを呼び出します。
  3. テキスト全体を置き換えるのではなく、各チャンクをテキスト ビューのストレージに追加します。
  4. 読み始めたら進行状況インジケーターを表示し、読み終わったら非表示にします。追加のクレジットとして、ファイルをどこまで処理したかをユーザーに示す確定的な進行状況バーにします。
于 2012-12-22T02:58:55.817 に答える