文件描述符,printf和std :: cout之间的区别

时间:2014-03-31 15:30:19

标签: c++ c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
//#include <iostream>
#include <string.h>
#include <fcntl.h>
#include <signal.h>

int main(){
int stdout = dup(1);
char p[] = "test.txt";
close(1);
int output = open(p, O_WRONLY | O_CREAT | O_TRUNC, 0777);
//std::cout << "lala" << endl;
printf("lala\n");
close(output);

dup(stdout);
close(stdout);
printf("lolo\n");
//  std::cout << "lolo" << endl;
return 0;
}

我认为printf和std :: cout必须输出相同的东西,我想在文件上输出“lala”,并在终端屏幕上显示“lolo”,为什么这个版本(带有prinf)在屏幕上打印所有内容带有“std :: cout”的版本打印出我喜欢的东西。

2 个答案:

答案 0 :(得分:1)

这与stdio库的内部缓冲有关。 "lala\n"太小而无法立即刷新到流中,所以它会保留在printf内部缓冲区中,直到稍后刷新为止。

如果你添加fflush,那么你会得到所需的结果:

int main(){
    int stdout_fd = dup(1);
    char p[] = "test.txt";
    close(1);
    int output = open(p, O_WRONLY | O_CREAT | O_TRUNC, 0777);
    //std::cout << "lala" << endl;
    printf("lala\n");
    fflush(stdout); // flush the internal buffer
    close(output); // fclose would flush too

    dup(stdout_fd);
    close(stdout_fd);
    printf("lolo\n");
    //  std::cout << "lolo" << endl;
    return 0;
}

此外,我已重命名您的本地变量stdout,因为这是stdio全局定义的变量。另外stdinstderr FILE *指向stdio控制流。

答案 1 :(得分:0)