Обнаружив, что во время записи 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() не перехватил его. Тем не менее проблема исправлена.