Почему ofstream не сможет открыть файл в C ++? Причины? - PullRequest
2 голосов
/ 13 ноября 2009

Я пытаюсь открыть выходной файл, который, я уверен, имеет уникальное имя, но иногда происходит сбой. Я не смог найти никакой информации, по каким причинам конструктор ofstream потерпит неудачу.

EDIT: Он начинает давать сбой в какой-то момент времени, и после этого он постоянно терпит неудачу, пока я не остановлю работающую программу, которая пишет этот файл.

EDIT: время от времени = 22-24 часа

фрагмент кода (мне это не помогло бы, но все же кто-то просил об этом)

ofstream theFile( sLocalFile.c_str(), ios::binary | ios::out );
if ( theFile.fail() ) 
{
    std::string sErr = " failed to open ";
    sErr += sLocalFile;
    log_message( sErr );
    return FILE_OPEN_FAILED;
}

Ответы [ 3 ]

10 голосов
/ 13 ноября 2009

Слишком много файловых дескрипторов открыто? Нет больше места? Доступ закрыт? Непостоянная проблема с сетевым диском? Файл уже существует? Файл заблокирован? Это ужасно сложно сказать без подробностей. Редактировать: Исходя из предоставленной вами дополнительной информации, может показаться, что у вас могут быть утечки файловых дескрипторов (открытие файлов и невозможность их закрыть и, следовательно, исчерпание лимита дескриптора файла для процесса).

Я предполагаю, что вы знакомы с использованием метода 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;
}
2 голосов
/ 13 ноября 2009

Возможно, вам не хватает места, или может быть проблема с разрешением. Операционная система также может заблокировать файл. Попробуйте другое имя / путь для ударов и посмотрите, сработает ли это тогда.

1 голос
/ 13 ноября 2009

Возможно, у вас запущен еще один экземпляр той же программы.

Другая причина в том, что, возможно, вы запускаете два экземпляра (для целей отладки?) Сразу друг за другом, и ОС не закончила закрывать файл и сбрасывать блокировки до того, как ваш следующий экземпляр программы появится и запросит его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...