Подтвердить что ты не робот

Как использовать объекты fstream с относительным путем?

Должен ли я всегда указывать абсолютный путь для объектов, созданных из класса std::fstream? Другими словами, существует ли способ указать только относительный путь к ним, такой как путь к проекту?

4b9b3361

Ответ 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