在 ofstream 写入期间检测到 space 不足,stream.fail() 无法工作
Detecting insufficient space during ofstream write, stream.fail() failed to work
我目前正在编写 DOD5220.22-M 的实现。下面的代码片段用于将二进制零写入文件,直到磁盘完全填满。
所以问题是使用 statvfs,它检测到 3800158208 字节(大约 3.82gb)的可写 space。但是,写入过程将在 3.77gb 处停止,并且会永远停留在那里。驱动器在此操作之前被格式化为 APFS,因此它完全是空的。
如您所见,我尝试使用 stream.fail() 来检测此类错误,但这似乎根本不起作用。系统是 MacOS 运行 g++8 和 C++17
我错过了什么? statvfs 是否检测到 space 比现在更可写,还是我做错了什么?
还有没有一种方法可以在每次迭代时不检查 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;
}
}
}
在听取@john 的建议并使用 POSIX 写入并将我自己的缓冲区设置为 4MB 并写入磁盘 size/4MB 时间后,问题就解决了。这是代码
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 默认缓冲区大小有关。也许缓冲区大于 space 剩余因此无法写入文件,但这并不能解释为什么 stream.fail() 没有捕获它。问题还是解决了。
我目前正在编写 DOD5220.22-M 的实现。下面的代码片段用于将二进制零写入文件,直到磁盘完全填满。
所以问题是使用 statvfs,它检测到 3800158208 字节(大约 3.82gb)的可写 space。但是,写入过程将在 3.77gb 处停止,并且会永远停留在那里。驱动器在此操作之前被格式化为 APFS,因此它完全是空的。
如您所见,我尝试使用 stream.fail() 来检测此类错误,但这似乎根本不起作用。系统是 MacOS 运行 g++8 和 C++17
我错过了什么? statvfs 是否检测到 space 比现在更可写,还是我做错了什么?
还有没有一种方法可以在每次迭代时不检查 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;
}
}
}
在听取@john 的建议并使用 POSIX 写入并将我自己的缓冲区设置为 4MB 并写入磁盘 size/4MB 时间后,问题就解决了。这是代码
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 默认缓冲区大小有关。也许缓冲区大于 space 剩余因此无法写入文件,但这并不能解释为什么 stream.fail() 没有捕获它。问题还是解决了。