将输入从标准输入传递到文件(C编程)

时间:2009-09-26 21:39:51

标签: c file function arguments

我在C中编写了一个程序,它有一个处理可以通过文件指针传递给它的文件的函数。

void process_my_file(FILE *fptr, ...) {
   /* do work */
}

我想从标准输入中读取一些输入并将其传递给我的函数,而不必将输入写入临时文件。是否可以通过文件指针参数传递它,就像它是一个文件一样,而不必将其写入磁盘?可以通过我可以添加到签名中的其他参数来完成吗?

我是新手,需要一些建议。提前谢谢!

3 个答案:

答案 0 :(得分:6)

您可以使用stdin作为参数调用您的函数。

my_process_file(stdin, ...);

担心这一点的唯一原因是你说'某些输入',但大多数函数都会读取所有文件并停止在EOF上。无论如何,你可以调用你的函数,只要它按照你的要求运行,你就没事了。您可能不应该假设标准输入返回后有任何额外的信息。

请注意,该函数不应依赖于fseek()等不适用于管道或终端的操作,因为stdin经常连接到它们。

答案 1 :(得分:0)

您可以使用freopen()函数打开标准输入。

另见Rerouting stdin and stdout from C

答案 2 :(得分:0)

我可以看到几个选项:

  1. 重写您的函数以获取文本,并要求调用它的人从文件中读取并将读取的文本传递给您的函数,而不是传递文件进行读取。您还可以编写一个包装函数来获取文件,读取内容,并将内容传递给带有文本的函数,以便人们可以继续简单地将文件句柄传递给您的函数。
  2. 了解编译器如何实现文件句柄,并创建一个函数来创建一个映射到字符串的文件句柄,其中从文件句柄“读取”获取字符串中的下一个字符。这可能是高度依赖于编译器的,并且可能很棘手,并且可能比它的价值更麻烦。取决于你需要多么糟糕。
  3. 如果您可以fseek()向后翻stdin,以便重新阅读您阅读的文字,然后将stdin传递给您的函数。当然,如果您想在传递之前更改stdin的输入,这将无效。此外,您可能无法在交互式文件句柄上fseek()。如果从文件中重定向stdin,OS X可以让我逃脱它,但即使你现在可以逃脱它,你也可能不应该这样做。