2

stdinのプログラムにメッセージ(たとえば、電子メールやその他の種類のメッセージ)が入る既存のプログラムがあります。stdinがFILE*であることは知っていますが、他にどのような特別な特性があるのか​​について少し混乱しています。現在、プログラムにチェックを追加しようとしています。特定の行(たとえば、「hello」という単語)が含まれている場合は、メッセージの処理方法が異なります。問題は、ファイル内でその単語を検索する必要があることですが、プログラムの後半で元の場所を指すようにstdinが必要です。構造の概要は以下のとおりです。

現在:

//actual message body is coming in on stdin
read_message(char type)
{

//checks and setup

if(type == 'm')
  {
    //when it reaches this point, nothing has touched stdin
        open_and_read(); //it will read from stdin
  }

//else, never open the message
}

別のチェックを追加したいのですが、メッセージ本文を検索する必要があります。そのようです:

//actual message body is coming in on stdin
read_message(char type)
{

//checks and setup

//new check
if(message_contains_hello())   //some function that reads through the message looking for the word hello
{
     other_functionality();
}

if(type == 'm')
  {
        //when it reaches this point, my new check may have modified stdin
    open_and_read(); //it will read from stdin
  }

//else, never open the message
}

これに伴う問題は、メッセージ本文を検索するには、ファイルポインタstdinに触れなければならないことです。ただし、2番目のifステートメントのメッセージを開いて読む必要がある場合(type ='m'の場合)、stdinは、プログラムの開始時に指していたのと同じ場所を指す必要があります。ポインターのコピーを作成しようとしましたが、それ自体を変更した場合にstdinも変更するコピーを作成することに成功しました。

メッセージを渡す方法を選択することはできません。メッセージはstdinにとどまる必要があります。stdin自体を変更せずに、stdinに着信するメッセージの実際の本文にアクセスするにはどうすればよいですか?基本的に、それからどのように読み取ることができ、メッセージの最初から別の関数も読み取ることができますか?

4

4 に答える 4

3

簡単な答えはあなたができないということです。標準入力からデータを読み取ると、それはなくなります。

したがって、あなたの唯一の本当の選択は、あなたが読んだものを保存し、標準の入力から直接読み取るのではなく、それに対して後の処理を行うことです。後の処理でファイルからの読み取りが必要な場合、1つの可能性は、これを2つの別個のプログラムとして構造化し、一方を他方のフィルターとして機能させることです。

于 2011-11-23T17:36:46.980 に答える
2

一般に、バイトを読み取ることができるのはstdin1回だけです。機能はありませんfseek()。この問題を解決するには、プログラム内のバッファーにバイトを読み込み、バイトを調べてから、残りのデータを実際に処理する別の関数にバッファーを渡します。

プログラムによっては、上のデータの一部のみを読み取る必要がある場合stdinもあれば、すべてのデータをそのバッファに読み取る必要がある場合もあります。いずれにせよ、おそらく何らかの方法でプログラム内の既存のコードを変更する必要があります。

于 2011-11-23T17:36:07.220 に答える
1

stdinがFILE*であることは知っていますが、他にどのような特別な特性があるのか​​について少し混乱しています。

まあ、それは読書のために開かれています。ただし、シーク可能であるとは限らないため、その内容を完全に読み込んでから、結果の文字列(または文字列のリストなど)を処理する必要があります。

于 2011-11-23T17:37:31.713 に答える
0

バッファリングを使用して利用する必要があります(バッファリングされたI / Oを<stdio.h>提供しますが、 setbufを参照してください)。

私の提案は、たとえばgetlineを使用して、 stdinを1行ずつ読み取ることです。行全体を読んだら、内部で最小限の先読みを行うことができます。

おそらく、構文解析手法についてもっと読むかもしれません。

于 2011-11-23T17:38:47.110 に答える