C文件指针,stdin上的多次读取

时间:2011-11-23 17:32:18

标签: c stdin file-pointer

我有一个现有的程序,其中一条消息(例如,电子邮件或其他类型的消息)将进入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中的消息的实际主体? 基本上,我如何从中读取,然后还有另一个功能能够从消息的开头读取?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

  

我知道stdin是一个文件*但是我对它有什么其他特性有点困惑。

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

答案 3 :(得分:0)

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

我的建议是逐行阅读 stdin ,例如使用getline。一旦你读完整行,你就可以在里面做一些最小的预测。

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