我如何在stdin中寻找

时间:2016-10-15 19:46:27

标签: c 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>。如果我能得到一些帮助,我会很高兴,并为我不太懂的英语感到抱歉。

2 个答案:

答案 0 :(得分:2)

  

有没有办法可以使用read()函数从中读取NOT   开始,但是例如从第二个字节开始?

最普遍的是,您可以忽略您不感兴趣的读入字节。

有时您可以lseek,例如如果你运行你的程序 一个常规文件设置为STDIN,如下所示:

./a.out < /etc/passwd

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

  

我怎么知道我是否读过整个标准时间?

read将在文件末尾返回 0

有关详细信息,请参阅手册页。 通常,您应该检查您的退货代码和帐户的简短读数。您的函数应该返回一个int,以便它能够传达可能的IO错误。

答案 1 :(得分:1)

stdin是不可寻求的。您可以读取字节,但无法快退或快进。 EOF(-1)表示stdin中的输入结束与常规文件一样,但如果您正在与用户进行交互式对话,则它有点宽松的概念。

基本上stdin是面向行的,最好使用模式printf()提示,从用户输入整行,printf()结果(如果适用)和另一个提示,从用户读取整行,等等至少在开始之前,你习惯了编程stdin。

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