【发布时间】:2021-03-02 03:43:30
【问题描述】:
对于 C 作业,我应该将大文本文件中的单词分解并逐个处理。基本上,一个词是任何线性的字母序列。因为,这将是我的程序的瓶颈,我想让这个过程尽可能快。
我的想法是使用扫描函数格式说明符 ([a-zA-z]) 将文件中的单词扫描到字符串缓冲区中。如果缓冲区已满,我检查文件中是否有更多字母(基于文件指针所在的位置)。如果有,那么我会增加缓冲区大小并继续将更多字母复制到缓冲区中,直到遇到非字母。
问题在于我使用的是 fscanf 还是 sscanf(将整个文件复制到一个字符串中)。一个比另一个快还是我的想法有更好的替代方案?
【问题讨论】:
-
文件中的数据是固定格式的?
-
@ameyCU 只是一个文本文件。不知道什么是固定格式?
-
大部分时间会在从磁盘读取数据时丢失,而不是在处理信息(如果你真的想要,fgets() 或 fgetc() 更快,但不是你的瓶颈) .如果可用,请考虑使用 ramdisk 的可能性。
-
@Heto 如果我使用 fgets 或 fgetc,我将需要处理每个字符(检查它们是否是字母)。我假设 fscanf 或 sscanf 实现在给我字母字符串方面会更好。
-
假设...但在您完成测量以证明这一点之前,您只是在猜测。使用
fgets()然后拆分线路,或使用getc()(如果您坚持使用fgetc(),可能会有可测量的差异)的性能不太可能有显着差异。但磁盘 I/O 时间仍占主导地位,您不太可能发现差异。