Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2013, 16:54   #1
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию Имя файла

Добрый день. Задача такая: запросить у пользователя путь к файлу и вывести на экран непосредственно название самого файла. Т.е. пользователь вводит E:\video\100_Greatest_Discoveries\0 9_fizika.avi, а на экран надо вывести 09_fizika.avi
У меня получилось что то странное. Выводится не сам файл, а еще и некоторые символы до последнего слеша (причем всегда по разному). Помогите, пожалуйста, разобраться.

Код:
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
	char folder[128];
	int len = 0, counter = 0;
	bool isSlash = 1;
	cout << "Enter a path: ";
	cin >> setw(128) >> folder;
	len = strlen(folder);
	while(isSlash)
	{
		if(folder[len] == '\\')
		{
			isSlash = 0;
		}
		len--;
		counter++;
	}
	cout << (folder + counter-1) << endl;
	system("pause");
	return 0;
}
Dima-War вне форума Ответить с цитированием
Старый 16.05.2013, 16:58   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Один вопрос: что у Вас оказывается в переменной counter на выходе из цикла, по-Вашему?
Abstraction вне форума Ответить с цитированием
Старый 16.05.2013, 17:17   #3
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Хмм... По идее там должно оказаться количество символов до слеша.
С конца, естественно.
Dima-War вне форума Ответить с цитированием
Старый 16.05.2013, 17:27   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Dima-War
Код:
#include <iostream>

using namespace std;

int main()
{
	string str;

	cin >> str;

	string::size_type pos = str.rfind('/');

	if (pos != string::npos) {
		cout << str.substr(pos + 1);
	} else {
		cout << "symbol '/' not found." << endl;
	}

	return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 16.05.2013, 19:26   #5
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Спасибо, конечно. Но хотелось бы полегче. Видимо в моем коде ошибка, хотелось бы понять где именно.
Dima-War вне форума Ответить с цитированием
Старый 16.05.2013, 19:52   #6
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
#include <iostream>

int main()
{ 
using namespace std;

char pFileName[128];
int len, cycleLen, pos;
bool IsSlash;
cout << "Enter filename: ";
gets(pFileName);
len = strlen(pFileName);
cycleLen = len;

IsSlash = false;
while (!IsSlash && cycleLen != 1)
{
	if (pFileName[ cycleLen ] == '\\') 
	{
		IsSlash = true;
		pos = cycleLen;
	}
	else 
	{
	cycleLen--;
	}
}
if (IsSlash)
{
pos++; //moving to the symbol after the slash symbol

//outputing information
cout << "Filename:: ";
while (pos != len)
{
	cout << pFileName[pos];
	pos++;
}
cout << endl;
}
else
	cout << "No filename found" << endl;
system("pause");
return 0;
}
Я использовал тот же алгоритм что и Вы.
Конечно, можно добавить еще несколько предусловий (e.g - правильность входных данных)

Последний раз редактировалось Igor95; 16.05.2013 в 19:57.
Igor95 вне форума Ответить с цитированием
Старый 16.05.2013, 21:55   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Хмм... По идее там должно оказаться количество символов до слеша.
С конца, естественно.
Та-ак. А какой смысл этой строки кода?..
Код:
	cout << (folder + counter-1) << endl;
Abstraction вне форума Ответить с цитированием
Старый 16.05.2013, 23:05   #8
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Та-ак. А какой смысл этой строки кода?..
Код:
	cout << (folder + counter-1) << endl;
-1 забыл удалить, рассчитывал без этого. Это получается как бы указатель, смещенный относительно начала массива на counter байт. Так рассказывали на курсах.

Последний раз редактировалось Dima-War; 16.05.2013 в 23:31.
Dima-War вне форума Ответить с цитированием
Старый 16.05.2013, 23:34   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Хмм... По идее там должно оказаться количество символов до слеша.
С конца, естественно.
Цитата:
Это получается как бы указатель, смещенный относительно начала массива на counter байт.
Ещё вопросы будут?
Abstraction вне форума Ответить с цитированием
Старый 16.05.2013, 23:35   #10
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Я тут такую особенность подметил. Я запрашиваю строку и вывожу переменную len на экран (ввожу тест, получаю длину равную 4). Дальше вывожу len в конце программы и она уже равна -608. Не понимаю почему. Ведь с каждым шагом цикла переменная len всего лишь уменьшается на единицу. А на выходе непонятно что.
Dima-War вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имя файла SashaS Microsoft Office Excel 4 16.03.2012 18:32
Имя файла glebast Помощь студентам 4 11.02.2012 23:59
Получить имя файла из ссылки(в конце ссылки нет имени файла) Человек_Борща Работа с сетью в Delphi 11 05.06.2011 15:15
Имя файла Ra88 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 08.07.2010 08:48
имя файла ? somwan Общие вопросы C/C++ 1 18.03.2009 17:46