2009-06-08 3 views
2

Итак, в коде :: Блоки в Ubuntu (последние).абсолютный путь ... путать (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 код мог компилироваться без каких-либо изменений.

+0

Почему downvote? Это правильный вопрос. – Zifre

+0

Надеюсь, вы отступаете от своего реального кода ... – Zifre

ответ

0

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

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

0

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

+4

Не говоря уже о том, что путь относительно того, где вы * запускаете * двоичный код, а не там, где он находится ... – workmad3

+0

данные и двоичные файлы находятся в одной папке, кодовые блоки запускают exe, как его бег из этой папки (я также пытался запустить с терминала ...) – csiz

1

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

0

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

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

+0

, так что еще один downvoter прошел мимо downvoting для удовольствия (?) ... так как нет комментариев о том, что он нашел в моем предложении кросс-платформы библиотека, чтобы получить доступ к пути без изменения кода на ubuntu и windows ... насколько я знаю, повышение полезно для такого рода мысли ... – stefanB

+0

То же самое здесь, но я перестал думать об этих вещах .. – bernhardrusch

0

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

Таким образом, код изменения в

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

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

0

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

cd whatever_dir_is_above_data 
./my_prog 

EDIT: К сожалению, вы, вероятно, также необходимо ./ перед программой, так как ., вероятно, не в вашем пути (я забыл его, потому что я всегда установить его на моем пути, так Мне не нужно вводить его).

+0

Я не знаю, t получить это: csiz @ csiz-desktop: ~/Desktop/C++/ep0/Program $ ep0 bash: ep0: команда не найдена ep0 находится в директории программы – csiz

2

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

Простое решение будет иметь сценарий 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 
+0

Я думаю, вы имеете в виду 'dirname', а не' basename' – KayEss

+0

Да, извините. Починил это. –

0

Скопируйте/каталог данных в каталог бен проекта или где компиляция двоичного файла.

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

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

Смежные вопросы