我有一个现有的程序,其中一条消息(例如,电子邮件或其他类型的消息)将进入stdin程序。 我知道stdin是一个文件*但是我对它有什么其他特性有点困惑。我正在尝试向程序添加一个检查,如果它包含一个特定的行(比如“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。但是,如果我仍然需要在第二个if语句中打开并读取消息(如果type ='m'),则stdin需要指向它指向程序开头的相同位置。我尝试创建指针的副本,但只是成功创建了一个副本,如果自己修改了stdin也会修改它。
我没有选择如何传递消息 - 它必须保留在stdin上。如何在不修改stdin本身的情况下访问stdin中的消息的实际主体? 基本上,我如何从中读取,然后还有另一个功能能够从消息的开头读取?
答案 0 :(得分:3)
简短的回答是,你不能。一旦你从标准输入读取数据,它就消失了。
因此,您唯一真正的选择是保存您阅读的内容,然后对其进行后续处理,而不是直接从标准输入中读取。如果你以后的处理需要从文件中读取,那么一种可能性就是将其构建为两个独立的程序,其中一个作为另一个程序的过滤器。
答案 1 :(得分:2)
通常,您只能从stdin
读取一次字节。没有fseek()
功能。要解决这个问题,你可以将字节读入程序中的缓冲区,查看字节,然后将缓冲区传递给另一个实际上与其余数据做某事的函数。
根据您的程序,您可能只需要阅读stdin
上的一些数据,或者您可能需要将所有数据读入该缓冲区。无论哪种方式,您可能必须以某种方式修改程序中的现有代码。
答案 2 :(得分:1)
我知道stdin是一个文件*但是我对它有什么其他特性有点困惑。
嗯,它已经开放阅读了。但它不能保证是可搜索的,所以你要完全读取它的内容,然后处理结果字符串(或字符串列表,或其他)。
答案 3 :(得分:0)