2016-02-29 6 views
-1

Я пытаюсь добавить эти функции.C++ Файловая система

std::string GetDirectory(std::string path_name) { 
    boost::filesystem::path path(path_name.c_str()); 

    path_name = path.string(); 

    path_name.erase(
     path_name.substr(
      path_name.find_last_of(DIRECTORY_SEPARATOR), 
      path_name.length() 
     ) 
    ); 
    return path_name; 
} 

std::string GetName(std::string path_name) { 
    boost::filesystem::path path(path_name.c_str()); 

    path_name = path.string(); 

    path_name.erase(
     path_name.substr(
      0, 
      path_name.find_last_of(DIRECTORY_SEPARATOR) 
     ) 
    ); 

    path_name.erase(
     path_name.substr(
      path_name.find_last_of("."), 
      path_name.length() 
     ) 
    ); 
    return path_name; 
} 

std::string GetExtension(std::string path_name) { 
    boost::filesystem::path path(path_name.c_str()); 

    path_name = path.string(); 

    path_name.erase(
     path_name.substr(
      0, 
      path_name.find_last_of('.') 
     ) 
    ); 
    return path_name; 
} 

Я пытаюсь добавить:

C: \ Windows \ Users \ Example \ Desktop \ test.txt

GetDirectory

C: \ Windows \ Пользователи \ Пример \ Рабочий стол

GetName

тест

GetExtension

TXT

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

Пожалуйста, запрошенные сообщения об ошибках:

1> C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V140 \ Microsoft.CppBuild.targets (368,5): предупреждения MSB8004: Выходной каталог не заканчивается конечной косой чертой. Этот экземпляр сборки добавит косую черту, поскольку это необходимо для правильной оценки выходного каталога. 1> main.cpp 1> main.cpp (287): ошибка C2664: 'std :: _ String_iterator >> std :: basic_string, std :: allocator> :: erase (std :: _ String_const_iterator >>, std :: _String_const_iterator >>) ': не может преобразовать аргумент 1 из' std :: basic_string, std :: allocator> 'в' unsigned int ' 1> main.cpp (287): note: нет оператора пользовательского преобразования, доступного, который может выполните это преобразование, или оператор не может быть вызван 1> main.cpp (301): ошибка C2664: 'std :: _ String_iterator >> std :: basic_string, std :: allocator> :: erase (std :: _ String_const_iterator >> , std :: _ String_const_iterator >>) ': не может преобразовать аргумент 1 из' std :: basic_string, std :: allocator> 'в' unsigned int ' 1> main.cpp (301): note: Нет пользовательского преобразования оператор, который может выполнить это преобразование, или оператор не может быть вызван 1> main.cpp (307): ошибка C2664: 's td :: _ String_iterator >> std :: basic_string, std :: allocator> :: erase (std :: _ String_const_iterator >>, std :: _ String_const_iterator >>) ': невозможно преобразовать аргумент 1 из' std :: basic_string, std :: allocator> 'to' unsigned int ' 1> main.cpp (307): примечание: нет оператора пользовательского преобразования, который может выполнить это преобразование, или оператор не может быть вызван 1> main.cpp (321): ошибка C2664: 'std :: _ String_iterator >> std :: basic_string, std :: allocator> :: erase (std :: _ String_const_iterator >>, std :: _ String_const_iterator >>)': невозможно преобразовать аргумент 1 из 'std :: basic_string , станд :: распределитель>»на„неподписанных Int“ 1> main.cpp (321): Примечание: ни один оператор определяемые пользователем преобразования доступны, которые не может выполнить это преобразование, или оператор не может быть назван

+0

«Я получаю ошибки» - и точнее? – Markus

+0

Отправленные сообщения об ошибках. –

ответ

-1
  • Удалить бесполезно и вредно path_name.substr( и ).
  • Вы можете опустить второй аргумент std::string::erase, чтобы стереть его до конца строки.
+0

Не работает, аварийная программа, но спасибо за ответ. Избавьтесь от подстроки и длины. –

+0

@MichaelKilpatrick Хотя результат был неправильным, [программа без повышения] (http://melpon.org/wandbox/permlink/MeDc8xpCxEIb0yNJ) не сработала. – MikeCAT

+0

Спасибо, так что проблема была проблемой? –

1

Вы должны использовать

template <class Path> typename Path::string_type extension(const Path& p); 

функцию, чтобы получить расширение.

И вы должны использовать

template <class Path> typename Path::string_type basename(const Path& p); 

функцию, чтобы получить базовое имя файла.

Предполагаю, что вы используете ОС Windows.

#include <iostream> 
#include <boost/filesystem.hpp> 

int main() 
{ 
    namespace fs = boost::filesystem; 

    std::string p = "C:\\Windows\\Users\\Example\\Desktop\\test.txt"; 

    std::string ext = fs::extension(p); 
    std::string bas = fs::basename(p); 

    std::cout << ext << " " << bas << std::endl; 

    return 0; 
} 
+0

Я новичок на C++, можете ли вы привести мне пример? Благодарим за отзыв. –

+0

Я добавил пример кода. Вот ты где :) – mustafagonul

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