我如何在标准输入中寻找

Voj*_*rda 5 c stdin

大家好,我需要帮助。我想读取stdin16 个字节。我转换成十六进制形式的每个字节。有没有一种方法可以使用read()函数从头读取 NOT,例如从第二个字节读取?另外我怎么知道我是否已经阅读了全文stdin?- 这样我就可以循环调用这个函数,直到我读完整个stdin

这是我做的一个函数:

void getHexLine()
{

  int n = 16;
  char buffer[n];
  read(STDIN_FILENO, buffer, n);
  buffer[n]='\0';
  //printf("%08x", 0); hex number of first byte on line - not working yet
  putchar(' ');
  putchar(' ');
  //converting every byte into hexadecimal
  for (int i = 0;i < 16;i++ )
  {
    printf("%x", buffer[i]);
    putchar(' ');
    if (i == 7 || i == 15)
        putchar(' ');


  }
  printf("|%s|\n", buffer);
} 
Run Code Online (Sandbox Code Playgroud)

输出应该是这样的,但可以选择从第二个字节开始。

[vcurda@localhost proj1]$ echo "Hello, world! This is my program." | ./proj1
48 65 6c 6c 6f 2c 20 77  6f 72 6c 64 21 20 54 68  |Hello, world! Th|
69 73 20 69 73 20 6d 79  20 70 72 6f 67 72 61 6d  |is is my program|
Run Code Online (Sandbox Code Playgroud)

这是一个学校项目,所以我不能使用malloc,scanf<string.h>. 如果我得到一些帮助,我会很高兴,并为我不太懂的英语感到抱歉。

Mal*_*ean 3

stdin 不可查找。您可以读取字节,但不能快退或快进。EOF (-1) 意味着 stdin 中的输入结束,就像常规文件一样,但如果您正在与用户进行交互式对话,那么它的概念有点宽松。

基本上 stdin 是面向行的,最好使用模式 printf() 提示,从用户输入整行, printf() 结果(如果适用)和另一个提示,从用户读取整行,依此类推,至少首先直到您习惯了对 stdin 进行编程。

从第二个字节开始就变得容易了。读取整行,然后在解析时从 i = 1 而不是 i = 0 开始。

  • 如果我运行程序“./some_program &lt; plain_file”,则标准输入是可查找的。如果你说“标准输入不一定是可搜索的”,那么就没有什么争论了——如果它是管道或终端,那么标准输入是不可搜索的。但笼统的说法是不正确的。 (5认同)
  • 将“stdin 不可查找”更改为“管道、套接字或终端不可查找”。stdin 的这种用法是完全可查找的: `./proj1 &lt;myfile` (2认同)