【问题标题】:C- Need to simulate stdin within the code when calling a functionC-调用函数时需要在代码中模拟标准输入
【发布时间】:2010-12-08 23:33:06
【问题描述】:
while( (reader=fread(array, sizeof(char), size, stdin))>0 )

当我调用一个我想模拟的函数时,我需要在这个循环内给我的fread 一些东西。

对可怕的英语感到抱歉。

【问题讨论】:

  • sizeof(char) 被 C 标准保证为 1。如果你想保持代码的灵活性,你可以写sizeof array[0],如果你改变数组的类型,它会相应地改变。否则,我只会使用 1。(但这是个人喜好。)
  • fread 更改为my_fread 并写my_fread 来做任何你想做的事情。

标签: c stdin


【解决方案1】:

这个答案是根据@Ben Voigt 的评论构建的。 使用一些文本创建input.txt,使用此代码创建main.c。 该代码会将input.txt 文本注入标准输入,然后将其发送到标准输出。

#include <stdlib.h>
#include <stdio.h>

int main() {
    freopen("input.txt", "r", stdin);

    unsigned int BLOCK_SIZE = 3;
    char buffer[BLOCK_SIZE];

    for (;;) {
        size_t bytes = fread(buffer, sizeof(char), BLOCK_SIZE, stdin);
        fwrite(buffer, sizeof(char), bytes, stdout);
        fflush(stdout);
        if (bytes < BLOCK_SIZE)
            if (feof(stdin))
                break;
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    @Fritschy 对@Ben Voigt 评论的回答构成了便携式解决方案。

    如果您使用的是 Unix/Linux/类似系统,您实际上可以通过

    将内容写入stdin
    int p[2];
    
    // error return checks omitted
    pipe(p);
    dup2(p[0], STDIN_FILENO);
    
    FILE *stdin_writer = fdopen(p[1], "w");
    

    现在写信到stdin_writer

    参见 POSIX 标准中的pipedup2fdopen

    【讨论】:

      【解决方案3】:

      您可以用您选择的 FILE* 替换标准输入以进行测试:

      FILE *test = fopen("mytestFile.txt", "r");
      /* your code here... */
      

      或者当需要标准输入时:

      FILE *test = stdin;
      /* your code here... */
      

      【讨论】:

      • 我怎样才能在执行时与我的守卫一起完成这项工作,假设我打电话给我 SIGINT 并且我想退出我的 while 但我正在等待标准输入...
      • 您可以打开文件 O_NONBLOCK 或使用 select(2) 或 poll(2)。然而,这些仅适用于普通 FD。您可以使用 fileno(3) 函数从 FILE* 获取 FD。有关更多信息,请参见手册页;)
      • 或者,您甚至可以在stdin 上致电freopen。不推荐用于生产代码,但在单元测试中它可能很有用。
      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 2023-01-30
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多