fstream :: close () не закрывает файл - PullRequest
1 голос
/ 28 декабря 2011

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

Иногда (не всегда, но довольно часто) происходит сбой при ошибке «нарушение совместного доступа».

Использование монитора процессов sysinternals Я видел, что в этих случаях операция закрытия не отражалась в мониторе процесса.

Похоже, что иногда системный вызов close пропускается без видимой причины и безлюбое исключение.

Это происходит на 64-битной машине Windows 7 с использованием Visual Studio 2010.

Пример кода;

void readFile(string file)
{
  ifstream stream(file);
  string line;
  while(getline(stream, line))
  {
    cout << line << endl:
  }
  stream.close(); // this is redundant
}

// вызывающий код:

readFile(file);
if(remove(file.c_str()) != 0)
{
  cout << "file deletion failed" << endl;
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2018

Это может произойти, если вы создаете промежуточные процессы, используя CreateProcess с bInheritHandles = true.Новый процесс унаследует дескриптор файла, и ваш основной процесс не закроет файл, так как он еще не обработан.Это может объяснить, почему вы не видите операцию закрытия в Process Monitor, ОС закроет файл, как только все дескрипторы будут освобождены.

0 голосов
/ 28 декабря 2011

Во-первых, вашему коду не хватает ;. Измените это cout << line << endl: на это cout << line << endl;

Вот похожая проблема: Любая причина, по которой объект std :: ofstream не закрывается должным образом?

...