Могу ли я получить имя файла или путь к нему из объекта fstream
? Я просмотрел методы fstream
и не нашел ничего похожего.
Получение имени файла (или пути) из fstream
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
Это выглядит хорошо, только вам нужно будет сказать, что имя должно быть удалено после уничтожения объектов fstream...
- person Alexis Wilke; 01.06.2016
Вполне возможно соответствовать стандарту и и включать способ извлечения имени файла, используемого для открытия файла. Это называется расширением.
- person Clearer; 15.08.2019
@Clearer Тогда никто не сказал, что это будет несоответствием. Дело в том, что Стандарт этого не предусматривает.
- person bloody; 07.01.2021
@bloody Это говорит не по крайней мере в реализации, соответствующей стандарту, что звучит так, как будто наличие этой функции сделало бы ее несоответствующей
- person Jimmy T.; 20.07.2021
Расширения НЕ являются частью Стандарта. Если вы используете такие функции, ваш код больше НЕ соответствует стандарту. Если вы измените свой компилятор, ваш код может не скомпилироваться, поскольку в вашем новом компиляторе может отсутствовать расширение, которое вы используете в своем коде.
- person Nawaz; 25.07.2021
вы также можете разработать небольшой класс, который наследуется от fstream
и ведет себя как fstream
, но также хранит свое имя файла.
person
Walter
schedule
27.05.2012
Это также позволяет добавить удобный конструктор, принимающий
std::string
, который требуется в C++11, но обычно отсутствует в реализациях C++03.
- person Jonathan Wakely; 27.05.2012
Или, если повторное использование и/или расширяемость не имеют значения, простая структура, хранящая строку и объект файлового потока.
- person Smartskaft2; 27.06.2021