Как использовать объекты 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