Intereting Posts
Укажите, является ли текстовая строка адресом IPv6 или IPv4-адресом с использованием стандартного API-интерфейсов C-сокетов Подписывается ли подписка на массив на адрес объекта? Не читать мой .txt-файл с паролями правильно на C Как я могу получить доступ к определенной группе бит из переменной? В функции «APR_DECLARE»: ошибка: ожидаемые спецификаторы декларации до «apr_strerror» c – не может принимать адрес битового поля Темы в режиме пользователя и ядра Процесс убийства, созданный с помощью popen2 Как перечислить все переменные среды в приложении ac / c ++ C – fopen () не работает (возвращает нулевой указатель) strcmp не работает Почему getchar () читает ‘\ n’ после инструкции printf? Может ли адрес локальных переменных сохраняться в функциях, возвращающих указатели Неизвестная проблема с ошибкой сегментации и связанными списками Маленький libc для встроенных систем

Как получить каталог файла, который вызывается из аргумента командной строки?

Например, я вызываю свой исполняемый файл в ubuntu:

./foo temp / game1.txt temp / game2 txt

Я использую realpath (), чтобы найти путь к game1.txt. Использование этого, однако, даст мне полный путь, включая имя game1.txt. Например, он выйдет как

/ home / * /Download/temp/game1.txt

Я хочу стереть game1.txt на этой строке, чтобы я мог использовать эту строку, чтобы использовать ее для вывода других файлов в этой папке. Два вопроса.

  1. Является ли realpath () хорошо использовать для такого рода операций? Есть ли лучший способ?
  2. Может ли кто-нибудь дать мне быстрый способ стереть «game1.txt», чтобы строка была «/ home / * / Download / temp /» сохранить в формате строки (а не char)?

Большое спасибо.

Не знаю Linux, но общий способ для вашего второго вопроса:

#include  #include  int main(){ std::string fullpath("/home/*/Download/temp/game1.txt"); size_t last = fullpath.find_last_of('/'); std::string path = fullpath.substr(0,last+1); std::cout << path; } 

Смотрите на Ideone .

Вы можете использовать функцию dirname для этого: http://linux.die.net/man/3/dirname

Обратите внимание, что dirname удаляет конечную косую черту (кроме корневого каталога); вам нужно будет добавить косую черту, когда вы добавите имя файла.

Кроме того, вам фактически не нужно использовать realpath для этой цели, вы можете просто использовать аргумент, переданный в, dirname даст вам «temp», и вы можете добавить к нему имена файлов.

  man -S3 dirname 

должен делать то, что вы хотите

Кросс-платформенное решение

 QFileInfo target_file_name(argv[1]); QString absolute_path = target_file_name.absolutePath() // eg /home/username/ QString some_other_file = QString("%1/another_file.txt").arg(absolute_path) // => /home/username/another_file.txt 

Boost.Filesystem также может сделать это легко. Я просто нахожу документацию QFileInfo легко ориентироваться.

http://doc.qt.nokia.com/4.6/qfileinfo.html#absolutePath