Как использовать объекты fstream с относительным путем?
всегда ли мне нужно указывать абсолютный путь для объектов, созданных из std::fstream
класса? Другими словами, есть ли способ указать только относительный путь к ним, такие как путь проекта?
7 ответов
вы также можете использовать относительные пути. Но они относятся к среде, из которой вы вызываете исполняемый файл.
Это зависит от ОС, но все основные системы ведут себя более или менее одинаково AFAIK.
пример Windows:
// File structure:
c:\folder\myprogram.exe
c:\myfile.txt
// Calling command from folder
c:\folder > myprogram.exe
В приведенном выше примере вы можете получить доступ к myfile.txt с "c:/myfile - ... формате txt" или "../ myfile.формат txt." Если иногда.exe был вызван из корня c:\
будет работать только абсолютный путь, но вместо " myfile.тхт" будет работа.
как сказал Роб Кеннеди в комментариях, на самом деле нет ничего особенного в путях относительно fstream. Но вот пример кода, использующий относительный путь:
#include <fstream>
int main() {
std::ifstream ifs("../myfile.txt");
... // Do something sensible with the file
}
Я знаю, что это немного старый вопрос, но для тех, кто interesed. У меня была такая же проблема и получается, что если у вас есть работает с C:\Users\Me
и вы хотите написать файл в C:\Users\Me\You\text.txt
,
затем:
std::ifstream ifs("you/myfile.txt");
или
std::ifstream ifs("you\myfile.txt");
не будет работать, вам нужно обязательно добавить текущий оператор пути .
, так:
std::ifstream ifs(".\you\myfile.txt");
совместимость
Вы можете использовать относительные пути. Они обрабатываются так же, как относительные пути для любых других файловых операций, например fopen
; нет ничего особенного fstream
в этой связи.
точно, как они обрабатываются, определяется реализацией; они обычно интерпретируются относительно текущего рабочего каталога Вашего процесса, который не обязательно совпадает с каталогом, в котором живет исполняемый файл вашей программы. Некоторые операционные системы также могут обеспечить единую работу каталог, совместно используемый все threads, поэтому вы можете получить неожиданные результаты, если поток изменяет рабочий каталог в то же время другой поток пытается использовать относительный путь.
скажите, что у вас есть src
папка непосредственно под каталогом проекта и src
папка содержит другой tmp_folder
папка, которая содержит txt-файл с именем readMe.txt
. Таким образом, txt-файл можно прочитать таким образом
std::ifstream fin("../src/tmp_folder/readMe.txt");
вы можете указать путь относительно текущей директории. В Windows вы можете вызвать GetCurrentDirectory для получения текущей директории или позвоните SetCurrentDirectory установить текущей директории. Также доступны некоторые функции CRT.
поведение специфично для ОС. Поэтому лучший способ справиться с этим ИМХО-сделать его чьей-то проблемой. Прочитайте путь к файлу, чтобы открыть его в виде строки от пользователя (e.g: аргумент командной строки, файл конфигурации, переменная env и т. д..) затем передайте эту строку непосредственно конструктору fstream. Документ, что это, как ведет себя ваша программа.
Я написал больше о манипуляции пути здесь:https://stackoverflow.com/a/40980510/2345997
в linux также:
// main.cpp
int main() {
ifstream myFile("../Folder/readme.txt");
// ...
}
предполагая, что структура папок примерно такая:
/usr/Douments/dev/MyProject/main.cpp
/usr/Documents/dev/MyProject/Folder/readme.txt