【问题标题】:How to print out specific lines of user input to console (C++)如何将用户输入的特定行打印到控制台(C++)
【发布时间】:2018-04-17 13:10:45
【问题描述】:

我正在使用 c++ 和终端。所以我的程序使用read(STD_FILENO,buf,BUFFER 接收用户输入,我试图只写回特定的行。

例如,如果用户总共输入了 10 行,我将如何打印出第 3 到 7 行或第 6 到 10 行?

我正在尝试使用 write() 函数 (write(STD_FILENO,buf,BUFFER)),但它没有打印出我想要的内容。
我尝试过使用 BUFFER 并尝试使其小于用户输入的字符总数,但它仍然无法正常工作。

我的理解是,无论我说BUFFER 是什么,它都会写到那个BUFFER 值,所以它会从0 开始到BUFFER。但是,如果我想从第 6 行开始,那可能从字符 #15 而不是 0 开始...这有意义吗?

请注意:我需要使用read()write()

谢谢!

【问题讨论】:

  • 如果您正在处理输入行,为什么不使用std::getline() 而不是read()??
  • 那么至少使用gets()?
  • 好吧,clarify 就在你的问题中,并提供一个minimal reproducible example 你到目前为止的情况,包括你遇到的具体问题的详细描述。

标签: c++ terminal console


【解决方案1】:

如果您只需要使用read(2)write(2),那么您还需要open(2)close(2)lseek(2),并且您需要在其之上设计和编码您自己的缓冲IO 库。仔细阅读这里提到的每个系统调用的文档。使用他们每个人的结果。处理代码中的错误情况。见errno(3) & perror(3)

所以保留一个缓冲区(或多个)和几个指针(或偏移量)到其中(可能至少是当前使用的位置,以及最后一个@987654333 @位置等)。

也许你会想要使用一些container。您可能会开始在缓冲 IO 类上实现自己的 fgetc 等价物,并在此之上构建。

在系统调用级别实际上并不存在行。您需要注意代码中的\n

顺便说一句,您可以学习几个实现<stdio.h>free software C 库的源代码,例如musl-libc

当然,您应该使用所有警告和调试信息(g++ -Wall -Wextra -gGCC)进行编译,并且您需要使用调试器gdb 来了解程序的行为并找到错误。不要害羞地在某些板上画出您的virtual address space 中发生的事情(用箭头表示的指针)。

注意:SO 不是做我的家庭作业服务。

【讨论】:

  • /OT 那么在没有 OP 对他们的问题发表评论的情况下,我们将如何进行 discussion?再说一遍:我怀疑这个问题是否值得回答,以便为格式之类的常见问题解答添加有价值的输入。
  • 我给出了重要的提示。所以我相信这个答案很有用。但是我不想做OP的功课
  • 当然,毫无疑问,您的回答很有用。不过这个问题真的不是很牛逼,先从题目说起吧。
  • 澄清一下:我不是要你做我的功课,其实我已经做了很多,但是为什么我要用不必要的代码来挤我的问题呢?我对在我的程序中发挥作用的一小部分感到困惑,这就是我问这个问题的原因。此外,我确保不要以一种听起来像是我希望有人通过解释我的理解来为我做硬件的方式来表达我的问题,如果我的理解是错误的,那么希望有人会向我指出这一点.请不要以错误的方式回答这个问题。
  • @daisygal 好吧,您的问题听起来像是功课,因为所有这些愚蠢的限制都是从无到有的。没有真正强有力的推理,没有真正的程序员会考虑它。
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2021-06-20
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多