Заблокирован
1

Из полного пути к файлу выделить только имя файла

06.09.2012, 13:24. Показов 21147. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написать программу, которая по введённому полному пути к файлу выделяла бы
только имя файла (то, что следует после последнего слеша или обратного слеша).
Например, ввод:
E:\video\100_Greatest_Discoveries\09_fizika.avi
вывод:
09_fizika.avi
Использовать класс std::string

можно ли реализовать болие ли мение просто? чтобы было понятно
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2012, 13:24
Ответы с готовыми решениями:

Строка: Вывести только название последнего каталога, имя файла и расширение из полного пути к файлу...
Задана строка, содержащая полный путь к файлу, начиная с диска. Вывести только название последнего...

Выделить из полного пути к файлу только имя файла
Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь), собственно...

Выделить из полного пути к файлу имя файла (без расширения)
Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь), собственно...

Выделить из полного пути имя файла
Задано строку, содержащую полное имя файла, то есть имя диска, список каталогов (путь), имя и...

18
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
06.09.2012, 13:32 2
первое, что приходит в голову:
C++
1
2
3
4
5
6
std::string data = 'E:\video\100_Greatest_Discoveries\09_fizika.avi'
std::string fileName = '';
int i = data.length() - 1;
while (data[i--] != '\\' ) ;
while (data[i++] != '.' )
    fileName += data[i];
1
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
06.09.2012, 13:32 3
http://www.cplusplus.com/refer... d_last_of/
там даже пример такой же, как у вас
0
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
06.09.2012, 13:33 4
довольно топорно, но должно работать
0
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 974
06.09.2012, 13:36 5
Выделяление только имя файла
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.09.2012, 14:06 6
можно ли реализовать болие ли мение просто?
boost/filesystem
0
Заблокирован
06.09.2012, 14:09  [ТС] 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
using namespace std;
 
 
int main()
{
    std::string data = "E:\\video\\100_Greatest_Discoveries\\09_fizika.avi";
 
    std::string fileName = "";
    int i = data.length() - 1;
 
    while (data[i--] != '\\' );
 
    while (data[++i] != '.')
    fileName += data[i];
 
    cout << fileName << endl;
}
он выдаёт \09_fizika
а мне нужно
09_fizika.avi

как сделать?
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
06.09.2012, 14:24 8
подправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    std::string s = "E:\\video\\100_Greatest_Discoveries\\09_fizika.avi";
    std::string fileName;
    int i;
    for(i = s.length(); (s[i] != '\\') && (s[i] != '/') && i >= 0; --i)
    ;
    while (s[++i] != '\0')
        fileName += s[i];
    cout << fileName << endl;
    return 0;
}
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.09.2012, 14:25 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <boost/filesystem.hpp>
int main()
{
 using namespace std;
 using namespace boost::filesystem;
 
 string data = "E:\\video\\100_Greatest_Discoveries\\09_fizika.avi";
 path p(data);
 cout<<p.leaf()<<endl;// 09_fizika.avi 
 
return 0;
}
1
Заблокирован
06.09.2012, 14:33  [ТС] 10
Цитата Сообщение от igorrr37 Посмотреть сообщение
подправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    std::string s = "E:\\video\\100_Greatest_Discoveries\\09_fizika.avi";
    std::string fileName;
    int i;
    for(i = s.length(); (s[i] != '\\') && (s[i] != '/') && i >= 0; --i)
    ;
    while (s[++i] != '\0')
        fileName += s[i];
    cout << fileName << endl;
    return 0;
}
в vs выходит ошибка.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 14:39 11
а в курсе, что у std::string есть ф-я rfind()? или посимвольный перебор своими руками приятнее?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.09.2012, 14:47 12
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
using namespace std;
 
  string data = "E:\\video\\100_Greatest_Discoveries\\09_fizika.avi";
  string result= data.substr(data.find_last_of("\\")+1,string::npos);
 
  cout<<result<<endl;
 
return 0;
}
2
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 14:49 13
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
string result= data.substr(data.find_last_of("\\")+1,string::npos);
а если там не \, а /? а вообще это - самый прямой подход.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.09.2012, 15:11 14
От куда там "/" ?

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
system("chcp 1251");
using namespace std;
 
string data = "E:/video/100_Greatest_Discoveries\\09_fizika.avi";
 
size_t ls= data.find_last_of("\\")+1;
size_t rs= data.find_last_of("/")+1;
 
size_t pos = (ls!=string::npos && ls>rs)?ls:rs;
 
string result= data.substr(pos,string::npos);
 
cout<<result<<endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
06.09.2012, 15:12 15
Цитата Сообщение от novi4ok Посмотреть сообщение
или посимвольный перебор своими руками приятнее?
Разумеется, приятнее.
Можно в один проход обработать и прямой, и обратный слэши.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,749
06.09.2012, 16:01 16
 Комментарий модератора 
KostyaKulakov, не дублируйте темы - это нарушает правила форума!

Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Можно в один проход обработать и прямой, и обратный слэши.
find_last_of
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 16:16 17
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
size_t ls= data.find_last_of("\\")+1;
size_t rs= data.find_last_of("/")+1;
как баден-баден прямо. зачем дважды?
C++
1
size_t ls= data.find_last_of("\\/")+1;
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 16:22 18
C++
1
2
3
std::string path ="E:\\video\\100_Greatest_Discoveries\\09_fizika.avi";
std::string file = path.substr( path.rfind('\\')+1 );
std::cout << "File name: " << file << std::endl;
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.09.2012, 18:24 19
зачем дважды?
От не знания find_last_of()
0
06.09.2012, 18:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2012, 18:24
Помогаю со студенческими работами здесь

Как извлечь имя файла из полного пути к файлу?
Вот к примеру, я загрузил файл, и в edt1.Text - он записал путь к файлу... C:\Program...

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

Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить из строки только имя первого католога
Помогите пожалуйста!!! Залание: Дано полное имя файла, т.е путь к файлу, имя и расширение....

Считывать имена файлов и выводить на экран только имя файла (вместо полного пути)
нужно считывать имена файлов и вывести на экран только имя файла а не полный путь


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru