cxh_404 2024-08-07 09:03 采纳率: 0%
浏览 7

关于#c语言#的问题:输出重定向

c语言的文件重定向,

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
void test(int fd);
int main() {
    // 保存标准输出的文件描述符
    int saved_stdout = dup(STDOUT_FILENO);
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open");
        return 1;
    }
    
    test(fd);

    if (dup2(saved_stdout, STDOUT_FILENO) == -1) {
        perror("dup2");
        return 1;
    }
    close(saved_stdout);

    printf("This output will be written to the terminal.\n");
    close(fd);
    return 0;
}

void test(int fd){
    
    if (dup2(fd, STDOUT_FILENO) == -1) {
        perror("dup2");
        close(fd);
    }

    printf("This output will be written to the file 'output.txt'.\n");
}

我对输出进行了两次重定向,但是运行后两个printf的输出依旧在终端。有知道是为什么吗?是重定向的作用域就是整个文件且只有最后一个重定向起作用,或者什么其他的原因?

  • 写回答

2条回答 默认 最新

  • 来一杯龙舌兰 2024-08-07 09:34
    关注

    在你的代码中,重定向的确起作用了,但是可能有些误解导致了输出不符合预期。让我们逐步分析一下:

    1. 文件描述符的重定向机制

      • dup2(fd, STDOUT_FILENO) 将文件描述符 fd 拷贝到 STDOUT_FILENO,这意味着所有后续对 STDOUT_FILENO 的写操作实际上会写入到文件 output.txt 中,而不是终端。
      • test() 函数中,你成功地将 STDOUT_FILENO 重定向到了 output.txt,所以 printf("This output will be written to the file 'output.txt'.\n"); 的输出确实写入了文件。
    2. 还原标准输出

      • main() 函数中,你在调用 test(fd) 之后,使用 dup2(saved_stdout, STDOUT_FILENO) 将原始的标准输出文件描述符 saved_stdout 恢复到 STDOUT_FILENO
      • 这样做的目的是为了确保后续的 printf("This output will be written to the terminal.\n"); 将输出到终端,而不是文件 output.txt
    3. 输出的理解

      • 当程序运行时,第一个 printf 在调用 test(fd) 前执行,因此它输出到终端。
      • test(fd) 函数内的 printf 由于重定向了 STDOUT_FILENOoutput.txt,所以其输出会写入到文件中。
      • main() 函数最后的 printf 之前,通过 dup2(saved_stdout, STDOUT_FILENO)STDOUT_FILENO 恢复为 saved_stdout,因此最后一个 printf 输出到终端。

    根据你的描述,程序运行后两个 printf 的输出依然在终端,这可能有几个可能的原因:

    • 输出缓冲:C标准库的输出通常会被缓冲,所以可能会延迟输出到终端。你可以在每个 printf 后面加上 fflush(stdout); 强制刷新缓冲区,以确保立即输出到终端。

    • 文件描述符关闭:确保文件描述符在适当的时候关闭,这样可以避免意外的文件操作问题。

    • 调试信息:在每个重要的步骤后打印调试信息,以确保程序按预期执行。

    综上所述,重定向的作用域是函数级别的,你的代码实现了预期的重定向行为。如果仍然存在输出不符合预期的问题,建议检查缓冲、文件描述符关闭以及添加更多的调试输出,帮助确定问题的所在。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月7日

悬赏问题

  • ¥15 Marscode IDE 如何预览新建的 HTML 文件
  • ¥15 K8S部署二进制集群过程中calico一直报错
  • ¥15 java python或者任何一种编程语言复刻一个网页
  • ¥20 如何通过代码传输视频到亚马逊平台
  • ¥15 php查询mysql数据库并显示至下拉列表中
  • ¥15 freertos下使用外部中断失效
  • ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
  • ¥15 devserver配置完 启动服务 无法访问static上的资源
  • ¥15 解决websocket跟c#客户端通信
  • ¥30 Python调用dll文件输出Nan重置dll状态