вектор возиться с std :: cout? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь сделать индикатор выполнения для копирования части диска на другую. Я использую класс индикатора выполнения, который имеет дело с печатью индикатора выполнения, который я обнаружил при замене стека (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);
    }
}

Все отлично работает.

Есть идеи, почему или как этого избежать?

1 Ответ

3 голосов
/ 16 апреля 2019
read(fd,&buff[0],512*i);

Переполнение буфера при i> 0.

...