-2

我有一个练习要做,我需要用 C 编写代码,命令相当于catnl,只使用系统调用。给我们的系统调用是 open()、close()、read() 和 write()。

我已经完成了等效的“cat”,它似乎运行良好,现在我需要做“nl”,但我无法逐行编写。

这个想法是使用尽可能少的系统调用。

我知道我需要在缓冲区中找到“\n”,我可以做一段时间循环遍历缓冲区并找到“\n”位置(我们称之为 X),然后将 X 个字节写入标准输出。

但是循环遍历缓冲区中的所有字符以搜索行尾对我来说感觉不对,但我不知道我还能怎么做......

重要编辑:
我认为你们中的一些人错过了我的问题的重点......我不需要解释如何做到这一点,这不是我的问题。我知道该怎么做(或者有一个很好的主意,我只是还没有尝试过)。“问题”是,逐个字符地遍历缓冲区、文件或其他内容以查找行尾(无论如何)是不正确的。我并不是说这不是答案,或者我不允许这样做那样做,我只是在谈论我的想法。这样做似乎是一种奇怪的方式,仅此而已......但如果是这样的话,那就是我问题的答案。

我感谢大家的帮助:)

4

5 回答 5

6

您将不得不在缓冲区中搜索\n,没有办法绕过它。不用担心性能,节目大部分时间都在readwrite

此外,请确保缓冲区足够大。不要打电话read(file,&c,1),因为它会非常慢。

于 2009-04-15T20:35:27.640 回答
3

找到“\n”的唯一方法是搜索它。如果您不能使用strchr(3),则必须遍历缓冲区以找到您要查找的内容(阅读:实现它)。

于 2009-04-15T20:32:46.913 回答
1

一个非常粗略的大纲:

  • 您可以替换getc(file)read(file,&c,1):只需编写一个接受文件作为参数并返回一个字符的函数。将字符读入本地变量并返回。

  • 然后实现一个getline(file):创建一个缓冲区,开始一次一个地读取字符,当你到达时停止'\n'(如果你用完了空间你会怎么做?),并返回一个指向缓冲区的指针(你如何分配缓冲这个工作?)。

  • 用你getline一次读一行,然后写下行号和行。

  • 循环直到文件用完...


减少系统调用:

一口气将整个文件读入一个大缓冲区——如果你有文件大小,这很容易——一次走一个字符来找到行的开始和结束(使用两个指针)。

于 2009-04-15T20:18:40.160 回答
1

如果您事先不知道行的长度,则没有找到 \n 位置的捷径。也就是说,除非您使用易于实现的函数来分割行,但这可能只会在某个地方做同样的事情。

也就是说,是的,您必须遍历字符:)

于 2009-04-15T20:20:37.910 回答
0

您实际上不需要知道 的位置'\n'来对行进行编号。您只需打印出行号(从 1 开始),然后读取字符,直到您点击换行符'\n'。使用 将每个字符复制回标准输出write(),如果该字符是换行符,则增加当前行数并将其打印出来。

于 2009-04-15T20:28:40.433 回答