我不明白这段代码是如何工作的。该程序必须仅使用getchar和putchar将FILE1的文本复制到FILE2。我最不了解的部分是从程序开始到结束。在第一行中,基本上它以读取模式打开第一个文件,并创建第二个文件进行读取和写入。然后将fdin指向in,将fdout指向out。然后,它将0分配给dupin,将1分配给dupout,我不知道为什么将它以某种方式将第一个文件的文本传递给另一个文件,并且还在FILE2上写入“复制终止”。你能解释一下吗?
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int fdin, fdout, dupin, dupout, c;
FILE *in, *out;
in=fopen("FILE1","r");
out=fopen("FILE2","w+");
fdin=fileno(in);
fdout=fileno(out);
if((dupin=dup2(fdin,STDIN_FILENO))<0)
printf("dupin error\n");
if((dupout=dup2(fdout,STDOUT_FILENO))<0)
printf("dupout error\n");
while ( (c=getchar()) != EOF)
putchar(c);
printf("Copy terminated\n");
exit(0);
}
答案 0 :(得分:0)
可以使用freopen()
;它是为此背景设计的。
但是,此代码中的第一个dup2()
调用使stdin
流下的文件描述符(文件描述符STDIN_FILENO
或0)引用了{{1}下的文件描述符}文件流。此后,当您从in
阅读时,它来自stdin
。
类似地,第二个FILE1
调用使dup2()
流下的文件描述符(文件描述符stdout
或STDOUT_FILENO
)引用了{{1 }}文件流。之后,当您写入1
时,它将转到out
。
如果代码在stdout
调用之后还尝试从FILE2
或in
读取,则存在混淆的风险。使用out
可以避免这种情况。
即使退出,您也不会关闭dup2()
或freopen()
。通常,最好关闭已打开的内容。由in
执行的代码(在out
返回时被调用)确实关闭 all 打开的文件流。原则上,您可以在exit()
调用之后立即关闭main()
和in
-不再需要它们。
另一种更好的替代方法是使用out
和dup2()
(使用getc(in)
的好方法)—除非问题规则似乎禁止这样做,否则显然编程练习。