免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6988 | 回复: 11

我用freopen改变了stdin/stdout的行为,可以恢复它们的功能么? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2012-03-09 22:59 |显示全部楼层
5可用积分
如果我在程序里面:

    freopen("3295.in","r", stdin);  
    freopen("3295.out","w", stdout);  

我能否在后面再去恢复stdin/stdout为控制台的I/O而不再是文件I/O呢?

最佳答案

查看完整内容

知道0/1/2么?

论坛徽章:
0
发表于 2012-03-09 22:59 |显示全部楼层
知道0/1/2么?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-03-09 23:27 |显示全部楼层
能不freopen吗……
先fopen "3295.in" 与 "3295.out", 得到两个FILE*并与fprintf/fscanf一起使用。
保持stdin/stdout不变。

标准C应该没有方法恢复的……

windows下可以试试
freopen("CON","r",stdin);
freopen("CON","w",stdout);

论坛徽章:
0
发表于 2012-03-10 09:10 |显示全部楼层
fclose (stdout);
这个呢?

论坛徽章:
0
发表于 2012-03-10 16:50 |显示全部楼层
walleeee 发表于 2012-03-09 22:59
知道0/1/2么?
那我怎么观察到描述符也随流一起变了呢?
  1. $ cat fileno.c

  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/stat.h>
  5. #include <string.h>

  6. void print_st(const struct stat* file_stat)
  7. {
  8.     printf("st_ino = %ld, st_dev = %d\n",
  9.             file_stat->st_ino, file_stat->st_dev);
  10. }

  11. int main(void)
  12. {
  13.     struct stat file_stat;
  14.     fstat(STDIN_FILENO, &file_stat);
  15.     print_st(&file_stat);
  16.     if (NULL == freopen("fileno.c", "r", stdin))
  17.     {
  18.         fprintf(stderr, "freopen error\n");
  19.         return 0;
  20.     }
  21.     fstat(STDIN_FILENO, &file_stat);
  22.     print_st(&file_stat);
  23.     return 0;
  24. }
  25. $ gcc fileno.c
  26. $ ./a.out
  27. st_ino = 3, st_dev = 10
  28. st_ino = 160919, st_dev = 64769
复制代码

论坛徽章:
0
发表于 2012-03-10 20:14 |显示全部楼层
The freopen() function shall first attempt to flush the stream and close any file descriptor associated with stream
http://pubs.opengroup.org/onlinepubs/009604499/functions/freopen.html
用描述符是没法还原流的噢

论坛徽章:
0
发表于 2012-03-11 02:25 |显示全部楼层
回复 5# jeung


我不知道你想表达什么。你想要什么?

论坛徽章:
0
发表于 2012-03-11 02:31 |显示全部楼层
回复 6# jeung


用dup2吧

论坛徽章:
0
发表于 2012-03-11 12:17 |显示全部楼层
回复 8# walleeee


    是我误会了了,忘记了dup

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2012-03-11 16:54 |显示全部楼层
walleeee 发表于 2012-03-11 02:31
回复 6# jeung

对!
先dup
再freopen
最后dup2

这样的话,即使用fstat的方法来查看,发现文件描述符和设备编号都没有变!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP