Как использовать объекты fstream с относительным путем? - PullRequest
24 голосов
/ 09 ноября 2011

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

Ответы [ 7 ]

16 голосов
/ 09 ноября 2011

Вы также можете использовать относительные пути.Но они относятся к среде, из которой вы называете свой исполняемый файл.

Это зависит от ОС, но все основные системы ведут себя более или менее одинаково.

Пример 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
}
11 голосов
/ 06 апреля 2016

Если у вас есть файл .exe, работающий с C:\Users\Me, и вы хотите записать файл в C:\Users\Me\You\text.txt, то все, что вам нужно сделать, это добавить оператор текущего пути ., поэтому:

std::ifstream ifs(".\\you\\myfile.txt");

будет работать

2 голосов
/ 09 ноября 2011

Вы можете использовать относительные пути.Они обрабатываются так же, как относительные пути для любых других файловых операций, например fopen;в этом нет ничего особенного в fstream.

Точно так, как они обрабатываются, определяется реализацией;они обычно интерпретируются относительно текущего рабочего каталога вашего процесса, который не обязательно совпадает с каталогом, в котором находится исполняемый файл вашей программы. Некоторые операционные системы могут также предоставлять один рабочий каталог, общий для всех потоков, поэтому вы можете получить неожиданные результаты, если поток изменяет рабочий каталог в то же время, когда другой поток пытается использовать относительный путь.

1 голос
/ 28 февраля 2017

Скажем, у вас есть папка src прямо в каталоге вашего проекта, а папка src содержит еще одну папку tmp_folder, которая содержит текстовый файл с именем readMe.txt. Таким образом, текстовый файл может быть прочитан таким образом

std::ifstream fin("../src/tmp_folder/readMe.txt");
1 голос
/ 06 декабря 2016

Поведение зависит от ОС.Поэтому лучший способ справиться с этим ИМХО - сделать это чужой проблемой.Прочитайте путь к файлу, который нужно открыть в виде строки от пользователя (например, аргумент командной строки, файл конфигурации, переменная env и т. Д.), Затем передайте эту строку непосредственно в конструктор fstream.Документируйте, как ведет себя ваша программа.

Я написал больше о манипулировании путями здесь: https://stackoverflow.com/a/40980510/2345997

0 голосов
/ 20 июля 2017

В Linux также:

// main.cpp
int main() {
    ifstream myFile("../Folder/readme.txt");
    // ...
}

Предполагается, что структура папок выглядит примерно так:

/usr/Douments/dev/MyProject/main.cpp /usr/Documents/dev/MyProject/Folder/readme.txt

0 голосов
/ 09 ноября 2011

Вы можете указать путь относительно текущего каталога .В Windows вы можете вызвать GetCurrentDirectory , чтобы получить текущий каталог , или вызвать SetCurrentDirectory , чтобы установить текущий каталог .Также доступны некоторые функции CRT.

...