繁体   English   中英

我如何在stdin中寻找

[英]How do I seek in stdin

大家好,我需要帮助。 我想从stdin读取16个字节。 我将每个字节转换为十六进制形式。 有没有办法我可以使用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);
} 

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

[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|

这是一个学校项目,所以我不能使用mallocscanf<string.h> 如果能得到一些帮助,我真的很高兴,对于我不太懂英语的情况感到抱歉。

有没有办法我可以使用read()函数从头开始读取NOT,但从第二个字节开始读取呢?

在大多数情况下,您可以简单地忽略不需要的读入字节。

有时,您将能够执行lseek ,例如,如果您使用设置为STDIN的常规文件运行程序,如下所示:

./a.out < /etc/passwd

但是lseek在终端,管道,字符设备或套接字的STDIN上将失败。

我怎么知道我已经阅读了整个标准输入?

read将在文件末尾返回0


请查阅手册页以获取更多信息。 通常,您应该检查您的返回码和短读帐户。 您的函数可能应该返回一个int,以便它可以传达可能的IO错误。

stdin不可搜索。 您可以读入字节,但不能后退或快进。 EOF(-1)表示标准输入中的stdin输入与常规文件一样结束,但是如果您要与用户进行交互式对话,则这有点松散的概念。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM