2016-10-15 16 views
2

こんにちは、私は助けが必要です。私はstdinから16バイト読みたいです。すべてのバイトを16進形式に変換します。私はread()関数を使用して最初からNOTを読み取る方法はありますか?たとえば2番目のバイトからですか?また、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); 
} 

出力はこのようなことが、第2から開始するオプションをする必要があります - 私はこれは私が作った機能です全体stdin

を読むまで、私はサイクルでこの関数を呼び出すことができます。この方法例えばバイト。

[[email protected] 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

文字ストリームを検索することはできません。残りの部分は余りにも広すぎます。あなたはレッスンに従っていたはずです。おそらくあなたのコースの資料を参考にして助けてくれるでしょう。そうでない場合は、無料でアクセスできるC本があります。 – Olaf

+3

'buffer [n] = '\ 0';' <=ここでは未定義の動作 – PSkocik

+1

戻り値を 'read()'から取得する必要がありますので、読み込まれたバイト数を知ることができます。 n(別名16)。短く読むことで何をすべきかを決める必要があります。 –

答えて

1

stdinは検索できません。バイトを読み込むことはできますが、巻き戻しや早送りはできません。 EOF(-1)は通常のファイルと同じようにstdinの入力の終わりを意味しますが、ユーザとの対話的な対話を行っている場合は少しゆるやかな概念です。

stdinは基本的には行指向です。パターンprintf()のプロンプトを使用し、userからの行全体を入力し、該当する場合はprintf()結果を入力し、別のプロンプトを表示し、ユーザーから行全体を読み込みます。あなたがstdinのプログラミングに慣れるまで、少なくとも最初は。

2番目のバイトから開始するのが簡単になります。行全体を読み込み、解析する際にi = 0ではなくi = 1から始めます。

+0

必ずしも真実ではありません。 – PSkocik

+0

ストリームがシーク不可能な場合、fseekはEBADFを返します。さもなければ、何らかの方法でシークに対応する何かを行いますが、stdinでうまくいく方法を知っていれば、stackoverflowに別の種類の質問を投稿します。 –

+0

stdinがリダイレクトされた通常のファイルの場合、シークが成功する可能性があります。しかし、stdinがシークできないと仮定するのはおそらく常に良いことです。 – PSkocik

2

私は 最初からしないで読み取るために()関数を読んで使用することができる方法はありますが、2番目のバイトから例えば?

ほとんど普遍的に、あなたは、単に読み取りのバイトあなたに興味がないを無視することができます。

を時々あなたはlseekのことができるようになり、例えばあなたが であなたのプログラムを実行する場合のようにそのSTDINに設定し、通常のファイル:

./a.out < /etc/passwd 

しかしlseekはターミナル、パイプ、キャラクタデバイス、またはソケットですSTDINsに失敗します。

標準入力全体を読み取ったかどうかはどのようにわかりますか?

readファイルの末尾にを返します。


詳細については、マニュアルページを参照してください。 一般的には、返品コードと短期間の読み込みを確認する必要があります。あなたの関数はおそらくintを返すべきであるので、IOエラーを通知する方法があります。

関連する問題