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に着信するメッセージの実際の本文にアクセスするにはどうすればよいですか?基本的に、それからどのように読み取ることができ、メッセージの最初から別の関数も読み取ることができますか?