2017-05-05 124 views
-4

功课 - 无需代码。伪代码正常。C - 无需使用fgets/getline,一次从文件1行读取

我们只允许使用3个libc函数:readmallocfree。然而,在学校的课程中,我们已经实现并编写了许多我们自己的libc函数版本,那些我们允许使用的版本是。我会列出它们,但其中大约有50个,所以相反,我一定会提及哪些我不能使用。

我的问题......我必须采取什么措施从文件中读取一行并将该行存储为字符串,而不需要\n?有没有人能够引导我完成整个过程?因为现在,我甚至不知道从哪里开始。我知道如何使用阅读,我会认为自己介于C和初级和中级技能之间,但是花了整整一天的时间搜索Google后,每次询问这个问题时,接受的答案总是涉及使用fgetsgetline,我们不允许使用它们,原因很明显。我已经实现了我自己的许多libc函数的版本,这些函数可能有助于这个项目,但是任何能够使这个项目快速简单的东西显然是不允许的。

再次,请不要代码,虽然伪代码是好的,但我更喜欢它,如果有人可以帮助我更好地了解我需要'告诉计算机'做什么,并从那里我应该没问题自己写代码。

+3

一次读取一个字符,存储它们。当你点击\ n时,停止。 –

+0

重复的问题;回答这里回答你的问题(基本上是什么菲尔M说):http://stackoverflow.com/questions/19769542/reading-from-file-using-read-function – Nugenrules

+1

不要气馁dowvotes。你的问题是一个很好的问题。 – fuz

回答

4

伪代码来读取1线

buffer to 0, size to 0, size_used to 0 
    loop 
     read 1 character 
     no success? - break loop 
     size_used >= size 
     make buffer bigger (maybe 2x, at least 1) 
     [This involves allocating a new buffer, copy existing data, freeing old buffer] 
     add character to buffer 
     was character a \n? - break loop 

    Nothing read? 
     return NULL 
    right-size buffer to size_used+1 
    append \0 
    return buffer (calling code needs to eventual free it.) 

大量的效率的提高是可能的。我建议从基本版本开始,获得正确的功能,然后考虑改进,如

  1. 性能:从文件中读取,一次可能是4k字节。

  2. 性能:重新使用返回的缓冲区。

  3. 使健壮和检查分配失败。

+0

本着与其他标准库(例如'strcat','sprintf','scanf'等)一致的精神,我建议'* buffer'由*调用者*而不是* callee * 。此外,关于阅读*可能一次4K *字节,我不认为这是一个性能的改善。我认为[我在* dailyprogrammer * excersize here](https://www.reddit。com/r/dailyprogrammer/comments/2q2zxe/weekly_18_holiday_code_a_time_of_sharing/cnf265o /),但我喜欢你的反馈... – Sebivor

+0

@Seb链接的提交不显示结果。代码本身有一个'for()'循环组件,可以从'fgetc()'v。'fread()'性能比较中拿走。代码的结果将是一个例子,而不是一个证明。代码与'stdin'流一起工作,它可以与本文所述的_file_有显着的性能差异。我没有看到链接的代码很好地支持你的疑问。 IAC,任何不改变O()复杂性的性能改进都会降低对学习者(OP)的价值,这就是为什么我的答案没有把注意力集中在伪代码中。感谢您的洞察力。 – chux

+0

然后,您的列表应该包含'-O3'和其他优化专用开关,因为它们可以彻底改变整个项目的实际性能特征。请举例说明你的4K读取优化没有这样一个'for'循环......哦,另一个话题是,如果优化功能打破*功能,它是一种优化。 OP只想读*到下一个换行符*和'ungetc'只能保证一次工作*所以你还需要依赖'fseek',*这不能保证有效地使用二进制文件的偏移量来寻找, 'stdin' * – Sebivor