gpt4 book ai didi

c++ - 文件描述符,printf 和 std::cout 的区别

转载 作者:行者123 更新时间:2023-11-28 06:59:04 26 4
gpt4 key购买 nike

#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”的版本打印我喜欢的东西。

最佳答案

这与 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 是指向它们的 stdio 控制流的 FILE *

关于c++ - 文件描述符,printf 和 std::cout 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22765753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com