2

我有一个现有程序,其中一条消息(例如,电子邮件或其他类型的消息)将进入标准输入上的程序。我知道 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
}

问题是要搜索消息正文,我必须触摸文件指针标准输入。但是,如果我仍然需要打开并阅读第二个 if 语句中的消息(如果 type = 'm'),stdin 需要指向它在程序开始时指向的同一个位置。我尝试创建指针的副本,但仅成功创建了一个副本,该副本在修改自身时也会修改标准输入。

我无法选择如何传递消息 - 它必须保留在标准输入上。如何在不修改标准输入本身的情况下访问进入标准输入的消息的实际正文?基本上,我怎样才能从中读取,然后让另一个函数也能够从消息的开头读取?

4

4 回答 4

3

简短的回答是你不能。一旦你从标准输入读取数据,它就消失了。

因此,您唯一真正的选择是保存您阅读的内容,然后对其进行后续处理,而不是直接从标准输入中读取。如果您以后的处理需要从文件中读取,一种可能性是将其构建为两个独立的程序,其中一个充当另一个的过滤器。

于 2011-11-23T17:36:46.980 回答
2

通常,您只能从stdin一次读取字节。没有fseek()功能。为了解决这个问题,您可以将字节读入程序中的缓冲区,查看字节,然后将缓冲区传递给另一个实际处理其余数据的函数。

根据您的程序,您可能只需要读取 上的一些数据stdin,或者您可能需要将所有数据读入该缓冲区。无论哪种方式,您可能都必须以某种方式修改程序中的现有代码。

于 2011-11-23T17:36:07.220 回答
1

我知道 stdin 是一个 FILE* 但我对它还有哪些其他特殊特性感到有些困惑。

嗯,已经开放阅读了。但不能保证它是可搜索的,因此您需要完全读取其内容,然后处理结果字符串(或字符串列表,或其他)。

于 2011-11-23T17:37:31.713 回答
0

您应该使用并利用缓冲(<stdio.h>提供缓冲 I/O,但请参阅setbuf)。

我的建议是逐行阅读您的标准输入,例如使用getline。一旦你阅读了整行,你就可以在里面做一些最小的前瞻。

也许您可能会阅读有关解析技术的更多信息。

于 2011-11-23T17:38:47.110 回答