Должен ли я всегда указывать абсолютный путь для объектов, созданных из класса std::fstream
? Другими словами, существует ли способ указать только относительный путь к ним, такой как путь к проекту?
Как использовать объекты fstream с относительным путем?
Ответ 1
Вы также можете использовать относительные пути. Но они относятся к среде, которую вы называете своим исполняемым файлом.
Это зависит от ОС, но все основные системы ведут себя более или менее тем же 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". Если myprogram.exe вызывается из корня c:\
, то работает только абсолютный путь, но вместо этого будет работать "myfile.txt".
Как сказал Роб Кеннеди в комментариях, нет ничего особенного в отношении путей, касающихся fstream. Но вот пример кода с использованием относительного пути:
#include <fstream>
int main() {
std::ifstream ifs("../myfile.txt");
... // Do something sensible with the file
}
Ответ 2
Я знаю, что это вопрос немного старше, но для тех, кто интересовался. У меня была такая же проблема, и получается, что если у вас есть файл .exe
, который работает от 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");
будет работать
Ответ 3
Вы можете использовать относительные пути. Они обрабатываются как относительные пути для любых других операций с файлами, например fopen
; в этом нет ничего особенного в fstream
.
Именно то, как они обрабатываются, определяется реализацией; они обычно интерпретируются относительно текущего рабочего каталога вашего процесса, что не обязательно совпадает с каталогом, в котором находится исполняемый файл программы. Некоторые операционные системы могут также предоставлять один рабочий каталог, общий для всех потоков, поэтому вы можете неожиданно если поток изменяет рабочий каталог, в то время как другой поток пытается использовать относительный путь.
Ответ 4
Скажем, что у вас есть папка src
прямо под вашим каталогом проектов, а папка src
содержит другую папку tmp_folder
, которая содержит txt файл с именем readMe.txt
. Таким образом, txt файл можно прочитать таким образом
std::ifstream fin("../src/tmp_folder/readMe.txt");
Ответ 5
Вы можете указать путь к текущему каталогу. В Windows вы можете вызвать GetCurrentDirectory, чтобы получить текущий каталог или вызвать SetCurrentDirectory, чтобы установить текущий каталог. Существуют также некоторые функции CRT.
Ответ 6
Поведение зависит от ОС. Таким образом, лучший способ справиться с этим ИМХО - это сделать его чужой проблемой. Прочитайте путь к файлу для открытия в виде строки от пользователя (например: аргумент командной строки, файл конфигурации, переменная env и т.д.), Затем передайте эту строку непосредственно конструктору fstream. Подтвердите, что так работает ваша программа.
Я написал больше о манипуляциях с путями: fooobar.com/questions/286570/...
Ответ 7
В linux также:
// main.cpp
int main() {
ifstream myFile("../Folder/readme.txt");
// ...
}
Предполагая, что структура папки выглядит примерно так:
/usr/Douments/dev/MyProject/main.cpp
/usr/Documents/dev/MyProject/Folder/readme.txt