【问题标题】:passing input from standard input to a file (C programming)将输入从标准输入传递到文件(C 编程)
【发布时间】:2009-09-26 21:39:51
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c file function arguments


    【解决方案1】:

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

    my_process_file(stdin, ...);
    

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

    请注意,该函数不应依赖诸如 fseek() 之类的操作,这些操作不适用于管道或终端,因为 stdin 经常与它们连接。

    【讨论】:

    • 澄清:“stdin”、“stdout”和“stderr”是在 stdio.h 中声明的预初始化 FILE* 变量,对应于 unix 进程的三个内置文件描述符。
    【解决方案2】:

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

    另见Rerouting stdin and stdout from C

    【讨论】:

    • 这是否允许您重新读取您已经从标准输入读取的输入?
    【解决方案3】:

    我可以看到几个选项:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-02-26
      • 2014-02-22
      相关资源
      最近更新 更多