абсолютный путь ... в замешательстве (Ubuntu) - PullRequest
2 голосов
/ 08 июня 2009

Так в Code :: Blocks в Ubuntu (последняя версия).

У меня есть проект, в котором я загружаю файл и читаю из него число.

#include <fstream>
using namespace std;
int main(){
    ifstream in("data/file.t");
    int n;in>>n;
}

теперь с cout<<n показывает -1203926 (и другие случайные числа), хотя число в файле 0.

data - это место, где находится двоичный файл (я имею в виду, что данные и двоичный файл находятся в одной папке (программе)), и я ожидал, что путь будет относительным, как в Windows ... но только если я введу полный путь /home/csiz/Desktop/C++/ep0/Program/data/file.t это даст мне 0.

Можете ли вы сказать мне, как сделать это относительный путь? Я бы предпочел, чтобы в Windows код мог компилироваться без каких-либо изменений.

Ответы [ 8 ]

2 голосов
/ 08 июня 2009

Путь относительно текущего рабочего каталога, а не каталога, в котором находится ваше приложение.

Простым решением было бы иметь скрипт SH, который изменяет рабочий каталог на каталог вашего приложения, а затем выполняет ваше приложение, например так:

$!/bin/sh

cd `dirname $0` # changes the working dir to the script's dir

./application-name # executes your application

# no need changing back to your previous working directory
# the chdir persists only until the end of the script

Нередко приложения имеют сценарии инициализации.

Вы также можете сделать это внутри вашего основного приложения C / C ++. Поскольку путь к исполняемому файлу передается в argv [0] основного метода, вы можете сделать то же самое.

Но я бы не советовал, потому что когда вы перераспределяете свое приложение в Linux, файлы данных обычно помещаются в другой каталог (обычно / var / lib), чем ваши исполняемые файлы (обычно /usr/bin).

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

MY_APP_DATA_PATH=/var/lib/my-app /path/to/executable
1 голос
/ 08 июня 2009

Я думаю, библиотека Boost Filesystem поможет, хотя у меня нет опыта работы с ней (только с другими библиотеками Boost - они отлично работали)

0 голосов
/ 23 июня 2009

После использования абсолютного пути я нашел ошибку.

В кодовых блоках вы можете войти в рабочий каталог (в котором он запустит программу) и я случайно вставил. там.

0 голосов
/ 08 июня 2009

Скопируйте каталог / data в каталог bin проекта или туда, где скомпилирован двоичный файл.

Относительные пути одинаковы для Linux и Windows (да, точно такое же использование, я использую их каждый день в своем коде кросс-платформенного приложения).

просто проверьте CASE, то есть все пути Linux являются CASE-SENSITIVE. это то, что мы упускаем при переходе с Windows на Linux

0 голосов
/ 08 июня 2009

Это означает, что ваш текущий каталог при запуске программы не установлен там, где он должен быть (он, вероятно, находится в вашем домашнем каталоге). Попробуйте запустить программу так:

cd whatever_dir_is_above_data
./my_prog

РЕДАКТИРОВАТЬ : К сожалению, вам, вероятно, также нужно ./ перед программой, поскольку ., вероятно, не в вашем пути (я забыл это, потому что я всегда устанавливал его в моем пути, поэтому я не нужно набрать его).

0 голосов
/ 08 июня 2009

Единственная причина, по которой этот относительный путь работает в «Windows», заключается в том, что ваша IDE выполняет двоичный файл в .. вместо data/. Если вы используете MSVC, вы можете быть в этом уверены.

Итак, измените код на

#include 
using namespace std;
int main() {
  ifstream in("file.t");
  int n;
  in>>n;
}

затем измените текущий каталог IDE на data/ -> порт завершен! :)

0 голосов
/ 08 июня 2009

Чтобы получить переносимые пути для Windows и Linux, вам нужно будет либо написать свои собственные методы для настройки путей к файлам, либо использовать библиотеку, например boost :: filesystem .

Я использовал boost :: filesystem в своих проектах, и я рекомендую это. Легко создать путь, проверить, существует ли файл, создать каталоги и так далее. Может быть, крутая кривая обучения для начинающего программиста на С ++, но основные вещи, такие как создание пути к файлу, должны быть простыми.

0 голосов
/ 08 июня 2009

Если двоичный файл находится в каталоге data, используйте file.t вместо data/file.t.

...