Обнаружив, что во время записи ofstream недостаточно места, stream.fail() не работает

В настоящее время я пишу реализацию 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 ответ

После того, как я принял совет @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() не перехватил его. Тем не менее проблема исправлена.

Другие вопросы по тегам