Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
fireLORD
0 / 0 / 0
Регистрация: 08.06.2013
Сообщений: 21
#1

Действие с файлом в зависимости от его типа - C++

08.06.2013, 22:05. Просмотров 837. Ответов 15
Метки нет (Все метки)

В общем препод сказал написать программу к понедельнику, мол напишешь - поставлю зачет
Суть программы с его слов:
"Я задаю любой путь к файлу, если этот .txt файл, на экране должно появиться сообщение "Это текстовый файл, открывается с помощью Блокнота", если это .jpeg файл, на экране должно появиться сообщение "Это графический файл, открывается с помощью Photoshop'a", если это .mp3 файл, на экране должно появиться сообщение "Это музыкальный файл, открывается с помощью Winamp'a"
Помогите пожалуйста, как сделать, чтоб он вбивал путь к файлу, а прога распознавала расширение, и в зависимости от этого выводило нужное сообщение на экран.
Заранее благодарю посетителей форума.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2013, 22:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Действие с файлом в зависимости от его типа (C++):

На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции - C++
Шаблоны функций (template) Суть: на вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции. ...

Выполнить действие в зависимости от значения переменной - C++
Товарищи, помогите найти ошибку. Код: #include <iostream> #include<windows.h> using namespace std; void one(); void...

Работа с файлом типа fstream - C++
Пишем несложный код: fstream file("Test.txt",ios_base::in|ios_base::app); int cnt = 0; while (cnt < 3) { cerr <<...

С++. Действие с числом и составляющими его цифрами. - C++
Помогите пожалуйста с заданием... ооочень нужно. Задание: Дано трехзначное число. Найти сумму и произведение его цифр. ...

Действовать в зависимости от типа переменной - C++
допустим есть массив в которой я хочу добавить по определённым индексам значение всех переменных передаваемой структуры. Проблема возникает...

Ветвление в зависимости от типа данных - C++
Подскажите, есть шаблон-функция. В неё приходит тип данных T или TT function(T* in, TT* out); Может быть так, что к примеру T =...

15
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
08.06.2013, 22:09 #2
Считывай путь, читай из него последние три символа и сравнивай их с расширениями.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
08.06.2013, 22:14 #3
Ну судя по названиям программ, целевая ОС - винда. Значит считывайте информацию о расширении из реестра и программу, которая ассоциируется с этим типом файла
0
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
08.06.2013, 22:15 #4
Очень легко. Если нужна оболочка, то используй WinAPI и приделывай кнопочки. Если консоль, то поставиль открытие каждого файла после нажатия на кнопку при помощи, например, system("pause").
После нажатия на кнопку или любой клавиши в консоли откроется окно выбора файла по проводнику. Код диалога такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <Windows.h>
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    OPENFILENAME ofn={0};
    char szDirect[260];
    char szFileName[260];
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = NULL;
    ofn.lpstrFile = szDirect;
    *(ofn.lpstrFile) = 0;
    ofn.nMaxFile =sizeof(szDirect);
    ofn.lpstrFilter = NULL;
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = szFileName;
    *(ofn.lpstrFileTitle) = 0;
    ofn.nMaxFileTitle = sizeof(szFileName);
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_EXPLORER;
    GetOpenFileName(&ofn);
    std::cout<<szDirect;
    std::cin.get();
    return 0;
}
Это возвратит тебе путь к файлу с его расширением.
Далее ты смотришь в самый конец строки и просто по условиям определяешь надпись, не обязательно посимвольно, например, послендие 4 буквы сравни с ".mp3", если не подошло, то последние 5 букв с ".jpeg" и так далее.
Когда условие верно, то ставь открытие на конкретную программу, а на форме или в консоли пиши фразу о типе файла. Открыть можно через
C++
1
ShellExecute(NULL, "open", /*путь к файлу строкой*/, NULL, NULL, SW_SHOWNORMAL);
это откроет программой по умолчанию...
Можно в цикл поместить, можно на одно открытие сделать, если это консоль. В оболочке можно вызывать на кнопку.
Если ничего не подошло, то вернуть надпись, типа "Не знаю такого расширения"...
Удачи, делов на 5 сек)
0
fireLORD
0 / 0 / 0
Регистрация: 08.06.2013
Сообщений: 21
08.06.2013, 22:16  [ТС] #5
Отлично, хорошая идея.
Тогда 2 вопроса навязывается..
Как будет выглядить строчка где он будет сам в консольном меню вводить путь к файлу
И как будет выглядить стрчока где прога считывает последние три символа из того, что ввел препод.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
08.06.2013, 22:18 #6
немного неоптимально, но поставленной задаче соответствует
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <sstream>
#include <string>
#include <locale>
#include <map>
 
int main()
{
    std::map<std::string, std::string> out;
    out["txt"] = "text file";
    out["jpeg"] = "image";
    out["mp3"] = "music file";
 
    std::ctype<char>::mask table[std::ctype<char>::table_size] = { std::ctype<char>::mask() };
    table[static_cast<std::size_t>(' ')] = std::ctype<char>::space;
    table[static_cast<std::size_t>('.')] = std::ctype<char>::space;
 
    std::string str;
    std::cout << "Enter a file name: ";
    std::getline(std::cin, str);
    std::istringstream stream(str);
    stream.imbue(std::locale(stream.getloc(), new std::ctype<char>(table)));
 
    while (stream >> str) {}
 
    std::cout << "this is a " << (out[str] != std::string() ? out[str] : "unknow file") << std::endl;
 
    return 0;
}
0
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
08.06.2013, 22:18 #7
Естественно директория и имя файла будут содержаться в переменных: szDirect и szFileName...
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
08.06.2013, 22:19 #8
Цитата Сообщение от Croessmah Посмотреть сообщение
Значит считывайте информацию о расширении из реестра и программу, которая ассоциируется с этим типом файла
Цитата Сообщение от MrCath Посмотреть сообщение
Когда условие верно, то ставь открытие на конкретную программу, а на форме или в консоли пиши фразу о типе файла. Открыть можно через
C++
1
ShellExecute(NULL, "open", /*путь к файлу строкой*/, NULL, NULL, SW_SHOWNORMAL);
это откроет программой по умолчанию...
задача ж заключается в том, чтобы получить расширение файла и вывести что это за файл. Или я что-то не так понял?
1
MrCath
7 / 7 / 1
Регистрация: 08.11.2012
Сообщений: 68
08.06.2013, 22:22 #9
Цитата Сообщение от fireLORD Посмотреть сообщение
Отлично, хорошая идея.
Тогда 2 вопроса навязывается..
Как будет выглядить строчка где он будет сам в консольном меню вводить путь к файлу
И как будет выглядить стрчока где прога считывает последние три символа из того, что ввел препод.
1. Диалог можно заменить на его ввод пути в массив символов. Это будет путем к файлу.
2. Сверять по условиям... что тут не понять?

Добавлено через 55 секунд
Kastaneda, ему нужно еще и открыть его прогой по умолчанию... ну или мне так показалось)
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
08.06.2013, 22:24 #10
Цитата Сообщение от MrCath Посмотреть сообщение
Kastaneda, ему нужно еще и открыть его прогой по умолчанию... ну или мне так показалось)
Цитата Сообщение от fireLORD Посмотреть сообщение
Я задаю любой путь к файлу, если этот .txt файл, на экране должно появиться сообщение "Это текстовый файл, открывается с помощью Блокнота", если это .jpeg файл, на экране должно появиться сообщение "Это графический файл, открывается с помощью Photoshop'a", если это .mp3 файл, на экране должно появиться сообщение "Это музыкальный файл, открывается с помощью Winamp'a"
мне по другому показалось)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
08.06.2013, 22:25 #11
Kastaneda, Ну если ограничится тремя расширениями, то норм.
А если препод выберет фаил .bmp, то не прокатит
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
08.06.2013, 22:27 #12
Цитата Сообщение от Croessmah Посмотреть сообщение
А если препод выберет фаил .bmp, то не прокатит
Дык оно напишет "unknow file". На любую претензию препода можно/нужно ответить "Нужно ТЗ граммотно формулировать, а не .bmp вводить"

А так да, самый верный путь - читать реестр.
1
fireLORD
0 / 0 / 0
Регистрация: 08.06.2013
Сообщений: 21
08.06.2013, 22:32  [ТС] #13
Kastaneda, А разве в твой код на 1ой странице, нельзя вставить еще расширения?
Он сказал мол чем больше сделаешь расширений, тем лучше. Думаю если сделать 3 то сделать еще 5 нет ни чего сложного)
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
08.06.2013, 22:36 #14
Цитата Сообщение от fireLORD Посмотреть сообщение
Kastaneda, А разве в твой код на 1ой странице, нельзя вставить еще расширения?
Он сказал мол чем больше сделаешь расширений, тем лучше. Думаю если сделать 3 то сделать еще 5 нет ни чего сложного)
Можно, но это неправильный путь (так индусы пишут). Если подразумевается расширение программы, то лучше сделать как сказал Croessmah, т.е. читать реестр.
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
08.06.2013, 22:38 #15
Цитата Сообщение от Kastaneda Посмотреть сообщение
то лучше сделать как сказал Croessmah, т.е. читать реестр.
fireLORD, тебе случайно не в Borland C++ 3.1 это надо сделать? Каким компилятором вы пользуетесь?
0
08.06.2013, 22:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 22:38
Привет! Вот еще темы с ответами:

Перегрузка оператора шаблонного класса в зависимости от типа - C++
Как заставить шаблон различать тип переменной которую ему передают? Пробую определить через type_traits, но не выходит - не компилируется....

Возвращаемая информация в зависимости от типа принимающей переменной - C++
Здравствуйте! Читаю книгу &quot;Язык программирования C++. Лекции и упражнения&quot;, и запнулся на одном моменте, который я так и не смог понять: ...

Различное поведение конструктора шаблонного класса в зависимости от типа параметра - C++
Здравствуйте. Возникла проблема - при попытке изменить поведение конструктора шаблонного класса (структуры) в зависимости от типа...

Выбор типа переменной-члена класса в зависимости от параметров передаваемых конструктору - C++
Здравствуйте форумчане! Ответьте пожалуйста на вопрос - возможно ли такое на С++ и если да, то как это реализовать? Имеется класс, в нём...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru