关于fork和cout<<'\n'的一个问题

问题描述

关于fork和cout<<'n'的一个问题

今天去趋势科技笔试做了这样一题,到现在还没搞明白,这一题类似这个题目:http://blog.csdn.net/u012243115/article/details/44784223
程序如下:

 #include <iostream>
#include <unistd.h>
#include <sys/types.h>
using namespace std;

int main()
{
    for(int i = 0 ; i < 2 ; i++)
    {
        cout<<"-n";
        fork();
        cout<<"-n";
    }
    cout<<endl;
}

问结果输出多少个”-“。

按照分析cout<<”n”并不刷新缓冲区,结果应该是输出16个-,但是实际只输出了9个-,说明刷新了缓冲区。如果把cout后面的n去掉,即程序变成下面这样:

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
using namespace std;

int main()
{
    for(int i = 0 ; i < 2 ; i++)
    {
        cout<<"-";
        fork();
        cout<<"-";
    }
    cout<<endl;
}

结果输出了16个-:

说明去掉n肯定没有刷新缓冲区,但是加上n为什么刷新了缓冲区,对于这个很是不理解。

解决方案

博客链接打不开了,什么问题?

解决方案二:

n只是换行符,endl才是刷新缓冲区。

解决方案三:

不过标准输出是按行的,所有有换行符也会刷出缓冲区,你的link中提到了。

时间: 2024-12-22 15:35:20

关于fork和cout&amp;lt;&amp;lt;&amp;#39;\n&amp;#39;的一个问题的相关文章

C++ 中cout&amp;lt;&amp;lt;endl的实现

话说像下面的语句,应该大家都明白这是通过重载operator <<函数来实现的. cout<<123; cout<<"ssss"; 但是像 cout<<endl; 是怎样实现的? 起初猜想endl是一个class或者struct,再通过一个friend函数来实现的. 但是翻下stl的实现,原来endl是一个函数! template<typename _CharT, typename _Traits> inline basic_

c++、cout缓存区问题-C++中的cout的缓存区清空问题

问题描述 C++中的cout的缓存区清空问题 很多地方都看到这样一个描述"cout有一个缓存区,当用cout向输出流中插入待输出内容时,这些待输出内容并不是立即就被送到输出设备了,而是先存入到这个缓存区中,当cout遇到endl或者缓存区满的时候才会向屏幕输出"请问这句话是对的吗?我怎么总感觉不对劲啊,感觉有矛盾啊,如果这个说法是正确的,那么是不是说当执行输出语句cout<<a时如果缓存区没有满或者没有遇到endl的时候就不能进行输出了吗?是这样理解吗?求解啊!!! 解决方

复刻:为 fork 的中文翻译定名

使用过 GitHub 的人大多知道它上面有个"Fork"的功能,用来将某个仓库克隆到你的账户之下,从而可以对其进行修改.衍生,也可以比较方便的将你的修改推回到原来的仓库(所谓的上游). 随着 GitHub 的流行,我们经常能在各种文章中见到,"fork 某某项目"等说法,是的,"fork"这个一直没有一个正式的译名. 其实这个问题不独出现在 GitHub 中,fork 这个词更早的出现在 Unix/Linux 中的 C 语言编程之中.在 Unix

fork() 函数与 Linux 中的多线程编程

一.fork()函数 在操作系统的基本概念中进程是程序的一次执行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中 创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程).系统调用函数fork()是创建一个新进程的唯一方式,当然 vfork()也可以创建进程,但是实际上其还是调用了fork()函数.fork()函数是Linux系统中一个比较特殊的函数,其一次调用会有两个返 回值,下面是fork()函数的声明: #inclu

Linux学习—fork用法

linux当中可以使用fork函数创建一个新进程 #include pid_t fork(void); 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1 在fork调用之后,子进程获得父进程数据空间.堆和栈的副本,但是并不共享这些存储空间部分. fork的一个特性是父进程的所有打开文件描述符都被复制到子进程中.父.子进程的每个相同的打开描述符共享一个文件表项. 这种共享文件的方式使父.子进程对同一文件使用了一个文件偏移量. fork有两种用法: (1)一个父进程希望复制自己,使父.子

递归求子集

#include <iostream> using namespace std; //作为全局变量 char set[] = {'a', 'b', 'c', 'd'}; bool isVisited[4] = {false}; int size = 4; void getAllSubset(int depth) { if (depth == size)//如果遍历完全集,打印出所有被标记为true的元素 { for (int i = 0; i < size; i++) { if (isV

大众点评笔试算法之质因数分解

将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 代码为: // 质因数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<cmath> #include<cstdlib> #include<iostream> using namespace std; void Analyse(int n) { //打印出 int i; for(i = 2;i <= sqrt(stat

把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助"多关键字排序"的思想来实现"单关键字排序"的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键