Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中重定向标准输出时的奇怪行为_C_File_Printf_Stdout_Dup - Fatal编程技术网

在C中重定向标准输出时的奇怪行为

在C中重定向标准输出时的奇怪行为,c,file,printf,stdout,dup,C,File,Printf,Stdout,Dup,我试图将stdout重定向到一个文件,然后用C将其还原到原始文件,但我面临着以下奇怪的问题—下面的代码成功地编写了 标准输出中的 标准输出中的 在stdout和文件中在各自的文件中,一切正常 #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #define STDOUT 1 int main(int argc, char* argv[]){ printf("in stdout \n");

我试图将stdout重定向到一个文件,然后用C将其还原到原始文件,但我面临着以下奇怪的问题—下面的代码成功地编写了
标准输出中的

标准输出中的

在stdout和
文件中
在各自的文件中,一切正常

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define STDOUT 1
int main(int argc, char* argv[]){
    printf("in stdout \n");
    int old_out = dup(STDOUT);
    close(STDOUT);
    int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777);
    printf("in file \n");
    close(fd);
    dup(old_out);
    printf("in stdout\n");
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义标准输出1
int main(int argc,char*argv[]){
printf(“在标准输出中”);
int old_out=dup(标准输出);
关闭(标准输出);
int fd=打开(“/重定向”,O|u CREAT | O|u RDWR | O|u TRUNC,0777);
printf(“在文件\n中”);
关闭(fd);
dup(old_out);
printf(“在标准输出中”);
返回退出成功;
}
但是,删除我的主函数的第一行:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define STDOUT 1
int main(int argc, char* argv[]){
    int old_out = dup(STDOUT);
    close(STDOUT);
    int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777);
    printf("in file \n");
    close(fd);
    dup(old_out);
    printf("in stdout\n");
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义标准输出1
int main(int argc,char*argv[]){
int old_out=dup(标准输出);
关闭(标准输出);
int fd=打开(“/重定向”,O|u CREAT | O|u RDWR | O|u TRUNC,0777);
printf(“在文件\n中”);
关闭(fd);
dup(old_out);
printf(“在标准输出中”);
返回退出成功;
}
导致 文件中的

标准输出中的


正在标准输出上写入,但文件中未写入任何内容。我想知道这是怎么发生的?谢谢您的帮助。

这是一个缓冲问题。在重新安装stdout之前,写入“in file”的缓冲区不会刷新,因此输出将转到stdout而不是文件。添加
fflush(stdout)
在这里修复了它。

考虑改用dup2()你知道吗
定义了一个宏
STDOUT\u FILENO
?@larsmans,我知道有这样的宏,但我认为它在stdlib.h中,当我遇到编译错误时,我自己定义了它以节省一些麻烦。@larsmans,10倍提醒一下。我现在已经更改了:)