矢量弄乱 std::cout?

vector messing with std::cout?

我正在尝试为将磁盘的一部分复制到另一个磁盘制作进度条。我正在使用进度条 class 处理打印我在堆栈交换 (https://codereview.stackexchange.com/questions/186535/progress-bar-in-c) 中找到的进度条,我对其进行了稍微修改以允许更精确(显示小数点)。

然而,为了复制文件,我使用了矢量,如果我将进度条对象的声明放在我的矢量声明之后,我将显示矢量的部分内容,而不是进度条。

这是一个不起作用的代码示例:

vector<char> buff(512);

progress_bar progress{std::cout, 70u, "Formating"};

int fd=open("/dev/sdc1",O_RDONLY);
int fd2=open("/dev/sdb1",O_RDWR);
double NbOfBlocks = 11800.0;
if (fd>0)
{
    for (int i = 0.0; i<NbOfBlocks; i++)
    {
        progress.write(i/NbOfBlocks);
        read(fd,&buff[0],512*i);
        write(fd2,&buff[0],512*i);
    }
}

如果我这样做:

progress_bar progress{std::cout, 70u, "Formating"};

vector<char> buff(512);

int fd=open("/dev/sdc1",O_RDONLY);
int fd2=open("/dev/sdb1",O_RDWR);
double NbOfBlocks = 11800.0;
if (fd>0)
{
    for (int i = 0.0; i<NbOfBlocks; i++)
    {
        progress.write(i/NbOfBlocks);
        read(fd,&buff[0],512*i);
        write(fd2,&buff[0],512*i);
    }
}

一切正常。

知道为什么或如何避免吗?

read(fd,&buff[0],512*i);

当 i > 0 时缓冲区溢出。