【问题标题】:Reading Specific Part Of A Text File读取文本文件的特定部分
【发布时间】:2013-11-16 08:28:53
【问题描述】:

我发现了一些与此类似但与 XCode 无关的问题。

我正在创建一个应用程序,在该应用程序中单击按钮会生成随机引用并将其显示在标签中。

我想做的是有一个包含所有引号的文本文件,然后让我的应用从该文件中随机选择一个引号。

问题是我的代码目前读取文件的全部内容。

    textHIYP = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
textHIYP.editable = NO;
[self.view addSubview:textHIYP];

textHIYP.text = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Quotes" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];

我能想到的唯一另一种方法是使用 arc4random() 代码来随机化它所在的文件,每个文件都包含一个单引号......但是因为我想要有一百多个引号,所以这个似乎不太理想。

关于如何读取文本文件的特定行有什么建议吗?

提前致谢!

【问题讨论】:

  • 这与 Xcode 无关。这是一个 Cocoa-touch / Objective-C 问题。
  • 什么是可可触感?我正在使用的程序是 Xcode。对不起,如果我误解了!
  • Xcode 是一个 IDE。您的问题与您使用的编辑器无关。 Objective-C 是一种编程语言。 Cocoa-touch 是您正在使用的 iOS 框架。您的问题是关于如何使用框架,用 Objective-C 编写的。
  • 呃……如果我戴着一顶写着“N00b”的帽子,我看起来简直一无所知!谢谢!我将寻找 Objective-C 教程。 :)

标签: ios cocoa-touch file


【解决方案1】:

您可以将整个文件读入NSString,然后使用componentsSeparatedByString:@"\n" 将其拆分为一个数组,将其保留在内存中,并在需要时返回数组的随机元素。如果只有数百(而不是数百万)行,那么使用的额外内存应该不是问题。

【讨论】:

  • 几百万行你会建议用什么来代替?
【解决方案2】:

你在模仿旧的fortune 程序的行为,所以也采用它的策略。引号数据库是一组文件,引号由仅包含特殊字符的行分隔:

Cabbage crates coming over the briny!
%
Top hole, squiffy!
%
Next we have number four, ”crunchy frog“.
%
Lemon curry?
%

对于这些报价文件中的每一个,都会生成一个伴随文件(使用strfile 实用程序),该文件存储每个报价的偏移量和长度。要选择引用,您只需将(相对较小的)索引文件加载到内存中,随机选择一个元素,然后使用该偏移量和长度从相应的引用文件中查找和读取单引号。

这是 GitHub 上的 Python implementation of fortune。原始的 C 代码也应该在某处浮动。

【讨论】:

  • 哈哈,好幽默!我明白了,我是 Monty Python 的粉丝!好的,因为我对 Xcode 和语言完全陌生,所以我不确定在哪里可以找到我可能能够集中起来执行此操作的代码。拥有大量不同文件的原始替代方案会是对内存的草率使用吗?访问文件并读取它后,我是否需要以某种方式关闭该文件以检索内存?有问题的文件非常小——每个文件都会有一个关于上面引用的文件长度的句子——但加载这些文件将是一个持续的行为。
  • ^ (每天一个宣传语,时间不定。)我只是不希望应用程序崩溃,因为我应该进行某种内存转储...:/
  • 是的,您将打开文件,读取您想要的行,然后关闭它。您无法避免将内存用于您需要的数据,但文件不会因为它是打开的而使用工作内存 - 只有当您实际获取内容时。
  • 太棒了-谢谢。这可能不是最优雅的解决方案,但考虑到我缺乏知识和所涉及的时间压力(如果可能的话,我希望将此应用程序作为圣诞节礼物)我会选择这个基本选项。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多