Получение имени файла (или пути) из fstream

Могу ли я получить имя файла или путь к нему из объекта fstream? Я просмотрел методы fstream и не нашел ничего похожего.


person Pavel Oganesyan    schedule 27.05.2012    source источник
comment
Я не думаю, что это возможно. Базовый файл может иметь несколько имен (если он имеет несколько жестких ссылок) или вообще не иметь имени (если, например, он представляет собой анонимный канал).   -  person Frédéric Hamidi    schedule 27.05.2012


Ответы (2)


Нет, это невозможно, по крайней мере, в стандартной реализации библиотеки.

Класс fstream не хранит имя файла и не предоставляет никаких функций для его извлечения.

Таким образом, один из способов отслеживать эту информацию — использовать std::map как:

std::map<std::fstream*, std::string> stream_file_table;

void f()
{
  //when you open a file, do this:
  std::fstream file("somefile.txt");

  stream_file_table[&file] = "somefile.txt"; //store the filename

  //..
  g(file);
}
void g(std::fstream & file)
{
    std::string filename = stream_file_table[&file]; //get the filename
    //...
}

Или просто передайте имя файла.

person Nawaz    schedule 27.05.2012
comment
Это выглядит хорошо, только вам нужно будет сказать, что имя должно быть удалено после уничтожения объектов fstream... - person Alexis Wilke; 01.06.2016
comment
Вполне возможно соответствовать стандарту и и включать способ извлечения имени файла, используемого для открытия файла. Это называется расширением. - person Clearer; 15.08.2019
comment
@Clearer Тогда никто не сказал, что это будет несоответствием. Дело в том, что Стандарт этого не предусматривает. - person bloody; 07.01.2021
comment
@bloody Это говорит не по крайней мере в реализации, соответствующей стандарту, что звучит так, как будто наличие этой функции сделало бы ее несоответствующей - person Jimmy T.; 20.07.2021
comment
Расширения НЕ являются частью Стандарта. Если вы используете такие функции, ваш код больше НЕ соответствует стандарту. Если вы измените свой компилятор, ваш код может не скомпилироваться, поскольку в вашем новом компиляторе может отсутствовать расширение, которое вы используете в своем коде. - person Nawaz; 25.07.2021

вы также можете разработать небольшой класс, который наследуется от fstream и ведет себя как fstream, но также хранит свое имя файла.

person Walter    schedule 27.05.2012
comment
Это также позволяет добавить удобный конструктор, принимающий std::string, который требуется в C++11, но обычно отсутствует в реализациях C++03. - person Jonathan Wakely; 27.05.2012
comment
Или, если повторное использование и/или расширяемость не имеют значения, простая структура, хранящая строку и объект файлового потока. - person Smartskaft2; 27.06.2021