Слишком много файловых дескрипторов открыто? Нет больше места? Доступ закрыт? Непостоянная проблема с сетевым диском? Файл уже существует? Файл заблокирован? Это ужасно сложно сказать без подробностей. Редактировать: Исходя из предоставленной вами дополнительной информации, может показаться, что у вас могут быть утечки файловых дескрипторов (открытие файлов и невозможность их закрыть и, следовательно, исчерпание лимита дескриптора файла для процесса).
Я предполагаю, что вы знакомы с использованием метода exceptions
для контроля того, сообщаются ли сбои iostream
как исключения или как флаги состояния.
По моему опыту, классы iostream
дают очень мало подробностей о том, что пошло не так, когда они терпят неудачу во время операции ввода-вывода. Однако, поскольку они, как правило, реализуются с использованием низкоуровневых функций API-интерфейса Standard C и OS, вы можете получить более подробную информацию об основном коде ошибки C или OS. Мне повезло, используя следующую функцию, чтобы сделать это.
std::string DescribeIosFailure(const std::ios& stream)
{
std::string result;
if (stream.eof()) {
result = "Unexpected end of file.";
}
#ifdef WIN32
// GetLastError() gives more details than errno.
else if (GetLastError() != 0) {
result = FormatSystemMessage(GetLastError());
}
#endif
else if (errno) {
#if defined(__unix__)
// We use strerror_r because it's threadsafe.
// GNU's strerror_r returns a string and may ignore buffer completely.
char buffer[255];
result = std::string(strerror_r(errno, buffer, sizeof(buffer)));
#else
result = std::string(strerror(errno));
#endif
}
else {
result = "Unknown file error.";
}
boost::trim_right(result); // from Boost String Algorithms library
return result;
}