簡體   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