Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个与linux等效的;nl";在C中使用系统调用的命令?_C_Linux_System Calls - Fatal编程技术网

如何创建一个与linux等效的;nl";在C中使用系统调用的命令?

如何创建一个与linux等效的;nl";在C中使用系统调用的命令?,c,linux,system-calls,C,Linux,System Calls,我需要做一个练习,在那里我需要用C编写代码,命令相当于只使用系统调用的cat和nl。给我们的系统调用有open()、close()、read()和write() 我已经做了“猫”的等效,它似乎运行良好,现在我需要做“nl”的一个,但我有困难,我将如何写一行一行 想法是使用尽可能少的系统调用。 我知道我需要在缓冲区中找到'\n',我可以在缓冲区中循环一段时间,找到'\n'位置(我们称之为X),然后将X个字节写入stdout 但是在缓冲区中的所有字符中循环搜索行的结尾对我来说并不合适,但是我不知道我

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

我已经做了“猫”的等效,它似乎运行良好,现在我需要做“nl”的一个,但我有困难,我将如何写一行一行

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

我知道我需要在缓冲区中找到'\n',我可以在缓冲区中循环一段时间,找到'\n'位置(我们称之为X),然后将X个字节写入stdout

但是在缓冲区中的所有字符中循环搜索行的结尾对我来说并不合适,但是我不知道我还能怎么做

重要编辑:
我想你们中的一些人没有抓住我问题的重点。。。我不需要解释怎么做,这不是我的问题。我知道怎么做(或者有一个很好的主意,我只是还没有试过)。“问题”是,在缓冲区、文件或其他任何地方逐字符循环查找行尾(无论如何)感觉不对。我不是说这不是答案,也不是说不允许我这样那样做,我只是在谈论我的想法。这样做似乎很奇怪,仅此而已。。。但如果是这样的话,那就是我问题的答案

我感谢大家的帮助:)

一个非常粗略的轮廓:

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

  • 然后实现一个
    getline(file)
    :创建一个缓冲区,开始一次读取一个字符,在到达
    '\n'
    时停止(如果空间不足,您将怎么做?),并返回一个指向缓冲区的指针(如何分配缓冲区使其工作?)

  • 使用
    getline
    一次读取一行,然后写入行号和行号

  • 循环,直到文件用完


要减少系统调用,请执行以下操作:


一次性将整个文件读入一个大缓冲区——如果您有文件大小,这很容易——然后一次遍历一个字符以查找行的开始和结束(使用两个指针)。

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


也就是说,是的,您必须循环使用字符:)

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

找到“\n”的唯一方法是搜索它。如果不能使用strchr(3),则必须在缓冲区上迭代以查找所需内容(读取:实现它)。

必须在缓冲区中搜索
\n
,无法绕过它。不要担心性能,程序的大部分时间都花在
读取
写入


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

这取决于你对家庭作业的看法,堆栈中是否有关于此的规则?我在哪里可以读到它?回到问题上来。。。read不接受3个参数吗?这将如何工作?读取的字节将存储在哪里?我不确定我能做什么和不能做什么,只是觉得做作业是不礼貌的。我们会帮你解答家庭作业问题,但不会给你答案。我修复了read()错误。等一会儿再说。是的,但就像我说的,这取决于你对家庭作业的看法。我不考虑这个作业。家庭作业,对我来说,是老师在家里做的练习,如果我做了,他会给我分数,如果我没有做,他会给我分数。事实并非如此。但是忘了这一点吧…刚刚看到了您的编辑,但是该解决方案将有太多的系统调用,其目的是尽可能少的调用。所以您是说逐字符读取()直到我找到一个“\n”?我在“cat”练习中使用了stdio.h(在我的机器上是8192)中的BUFSIZ…为什么它“感觉不正确”?这是正确的做法。循环通过内存中的字符缓冲区是非常快的,不涉及任何系统调用。我不知道,它只是看起来很奇怪。。。无法解释。