Обнаружив, что во время записи ofstream недостаточно места, stream.fail () не работает - PullRequest
0 голосов
/ 15 февраля 2019

Я сейчас пишу реализацию DOD5220.22-M.Часть кода ниже предназначена для записи двоичного нуля в файл, пока диск не будет полностью заполнен.

Так что проблема в использовании statvfs, он обнаруживает 3800158208 байт (около 3,82 ГБ) доступного для записи пространства.Тем не менее, процесс записи остановится на 3.77gb, и он просто застрянет там навсегда.Диск отформатирован в APFS непосредственно перед этой операцией, поэтому он полностью пуст.

Как вы можете видеть, я пытаюсь использовать stream.fail () для обнаружения такой ошибки, но, похоже, это не работает вообще,Система MacOS работает под управлением g ++ 8 с C ++ 17

Чего мне не хватает?Обнаруживает ли statvfs больше доступного для записи пространства, чем есть, или я делаю что-то не так?

Также есть ли способ писать, не проверяя stream.fail () каждую итерацию?

Заранее спасибо.

{
statvfs("/Volumes/SECUREERASE", &space); // get space
size =  space.f_frsize * space.f_bavail;
char zero = 0;
    for (int i = 0; i < size; ++i){ // while space left, write
        file.write(&zero, sizeof(char));
        if(file.fail()){
            break;
        }
    }
}

1 Ответ

0 голосов
/ 15 февраля 2019

После того, как я принял совет @ john и использовал запись POSIX, установил собственный буфер на 4 МБ и записал на диск размером 4 МБ, проблема была решена.Вот код

int file = open("run1",O_WRONLY);

char zero[4000000] = {0};
for (long unsigned int i = 0; i < (size/4000000); ++i) { // while space left, write
    write(file,&zero, sizeof(zero)* sizeof(char));
}

Хотя я до сих пор не уверен в том, что именно вызвало мою проблему, я могу с уверенностью предположить, что это как-то связано с размером буфера fstream по умолчанию.Возможно, буфер был больше, чем оставшееся пространство, поэтому не может быть записано в файл, однако это не объясняет, почему stream.fail () не перехватил его.Тем не менее проблема устранена.

...