试图阅读整个文本文件

时间:2012-12-21 21:34:34

标签: c++ objective-c cocoa

我正在尝试读取txt文件的整个包含,而不是逐行,但整个包含

并将其打印在xcode文本域内的屏幕上

我正在使用obj-c和c ++ lang的混合:

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 个答案:

答案 0 :(得分: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];
 }

答案 1 :(得分: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(来自cstdio的FILE*)。在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
}

答案 2 :(得分:0)

要回答为什么您的解决方案不起作用的问题:

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

假设Data引用文本字段,setStringValue:将使用您传入的字符串替换字段的全部内容。您的循环一次读取并设置一行,因此在任何给定时时间,string是文件中的一行。

只有当你在主线程上没有做任何其他操作时,才会告诉显示视图,所以你的循环 - 假设你没有在另一个线程或队列上运行它 - 不会一次打印一行。您读取每一行并用该行替换文本字段的内容,因此当您的循环结束时,该字段留下您将stringValue设置为文件的最后一行的最后一行。

立即整理整个文件会有效,但仍存在一些问题:

  • 文本字段不适用于显示多行。无论您如何阅读文件,您仍然会将其内容放在不适合此类内容的地方。
  • 如果文件足够大,阅读它将花费大量时间。如果你在主线程上执行此操作,那么在此期间,应用程序将被挂起。

一个合适的解决方案是:

  1. 使用文字视图,而不是文字字段。构建文本视图以处理任意数量的行的文本,当您在笔尖中创建一个文本视图时,它将自由包装在滚动视图中。
  2. 一次读取文件一行或其他有限大小的块,但不能在forwhile循环中读取。使用NSFileHandle或dispatch_source,其中任何一个都会在读取文件的另一个块时调用您提供的块。
  3. 将每个块附加到文本视图的存储中,而不是用它替换整个文本。
  4. 开始阅读时显示进度指示,然后在阅读完后隐藏它。要获得额外的功劳,请将其设置为确定的进度条,向用户显示您通过该文件的距离。