我有以下代码(在互联网上找到)
FILE *fp;
fp=fopen("text.txt","w");
int fd=open("text.txt",O_WRONLY,S_IWUSR);
dup2(fd,1);
此代码将管道从屏幕重定向到名为text.txt
的文件
现在我需要做相反的事情。我想将管道写入从此文件更改为屏幕。
有没有人有想法?谢谢
答案 0 :(得分:1)
该代码仅起作用,因为有些东西正在将数据推送到管道中。如果您只是简单地改变了guzintas和comzoutas的布线,情况就不是这样了。您需要打开文本文件进行读取,然后将文件读入内存并将其写入屏幕。有很多针对cat.exe克隆的源代码示例,请查看GitHub上的代码。
这是一个非常简单的例子:
#include <stdio.h>
void spewfile(FILE *fp)
{
char buf[BUFSIZ];
while(fgets(buf, sizeof(buf), fp))
fputs(buf, stdout);
}
答案 1 :(得分:0)
在Linux上,您可以写入/dev/tty
,但这并不等同于恢复写入stdout,因为您可能无法从调用程序重定向输出(不确定 - 是顺便说一句,我不确定这是否可以移植到其他基于Unix的系统。
int fd=open("/dev/tty",O_WRONLY);
dup2(fd,1);
否则,您应该在第一次重定向之前将文件描述符1复制到另一个,以便以后能够恢复它。
/* save fd 1 */
int sav=dup(1);
/* redirect to file */
int fd=open("text.txt",O_WRONLY,S_IWUSR);
dup2(fd,1);
/* done anything you wanted here (redirected to text.txt) */
/* ... */
/* revert redirection */
dup2(sav,1);
/* do anything you want here (having reverted the redirection back to stdout) */
/* ... */
顺便说一下,应该避免同时使用缓冲(fopen)和无缓冲(开放)I / O.这将导致问题,因为缓冲的I / O不会被告知您使用无缓冲I / O同时执行的操作。