Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
lohness
129 / 101 / 5
Регистрация: 24.04.2008
Сообщений: 930
#1

стоит связываться или это не задачка для начинающих? - C++

22.11.2013, 16:10. Просмотров 1872. Ответов 52
Метки нет (Все метки)

Объясню предысторию.
Многие хранят свои картинки на яндексе, затем делают пост вставляя в него уменьшенные копии, причем не всегда есть ссылка на сам альбом где можно взять оригиналы.
Для сохранения оригиналов из альбомов приходится сначала скачивать файл с ссылками, затем править в нем ссылки с копии на оригиналы (благо это несложно), запускать измененный файл, потом сохранять с картинками.
НО яндекс меняет имена файлов на случайные значения поэтому для упорядоченного списка (например страниц книжки) приходится сейчас редактировать файл убирая все не относящееся к именам а затем делать батник который уже переименует имеющиеся файлы.

Даже если есть прямая ссылка на альбом, то там можно скачать его целиком через какой-нибудь менеджер закачек целиком, но, опять же, названия будут кучей символов.


Вот такая понимашь загогулина

Давно хочется автоматизировать хотя бы последнюю часть html -> bat , которая отнимает львиную часть времени.

В идеале, конечно, хотелось бы просто скармливать программе ссылку, а на выходе получать файло-картинки с номерами по порядку в соответствующей папке.

Опыт программирования очень небольшой С на 286 (лет 20 назад в институте) поэтому думаю, что полностью задачу не потяну (вообще не в курсе как заставить общаться прогу с инетом).

А вот работу со строками наверное смогу попробовать.

Как я понимаю надо

1. убрать из файла все строки где нет слова orig.jpg

останутся строки такого вида:
rel="nofollow"><IMG width="800" height="534" title="" alt="" src="папка1_files/0_cfbf2_39396e7_orig.jpg"

2. укоротить строчки до прямых ссылок на картинки

0_cfbf2_39396e7_orig.jpg

4. далее добавить в каждой строчке с

3. далее добавить в каждой строчке слева REN справа xx.jpg

ren 0_cfbf2_39396e7_orig.jpg 01.jpg
ren 0_cfbf3_931d3197_orig.jpg 02.jpg
ren 0_cfbf4_22ba9201_orig.jpg 03.jpg
ren 0_cfbf5_12b53a87_orig.jpg 04.jpg


4. далее сохранить это в bat-файл, который и переименует мои файлы

Куда смотреть в первую очередь

P.S. Может я придумываю велосипед и все уже придумано до нас?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2013, 16:10     стоит связываться или это не задачка для начинающих?
Посмотрите здесь:

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

Низкоуровневость в c++. Стоит или не стоит его учить? - C++
Приветствую! Захотел выучить язык c++, но знакомый сказал, что у него есть стремление к низкоуровневости! Подскажите пожалуйста, можно...

Что такое __attribute__((packed)),и когда это стоит использовать? - C++
Читаю чужие исходники,там встречается __attribute__((packed)) и используется в структурах.Я пробовал приписывать это окончание также к...

Странная реализация класса - многоточие: стоит ли понимать это буквально? - C++
Здравствуте! Читаю книгу Александреску по C++ и в листинге приводится вот такая строка: class NullPointerException: public exception {...

Факториал! Для кого-то это легко, а кто-то вообще это не знает! - C++
Написать определение функции факториал которая возвращает факториал от полученного в качестве аргумента числа. Реализовать на С++ и...

С/С++ для начинающих - C++
Вводится последовательность целых чисел, 0 – конец последовательности. Вычислить количество положительных чисел, кратных 7 и не кратных 5 и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
22.11.2013, 18:35     стоит связываться или это не задачка для начинающих? #16
Не для холивара, но решать такие задачи на голых плюсах - изврат. Аналогичное решение на питоне, втрое компактнее
Python
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
from HTMLParser import HTMLParser
 
 
class ImgFetcher(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.imgs = []
 
    def handle_starttag(self, tag, attrs):
        if tag == 'img':
            for name, value in attrs:
                if name == 'src':
                    pos = value.rfind('/')
                    jpg_name = value[pos + 1:]
                    self.imgs.append(jpg_name)
                    break
 
 
if __name__ == '__main__':
    with open('index.html') as infile:
        html = infile.read()
        img_fetcher = ImgFetcher()
        img_fetcher.feed(html)
 
        counter = 0
        for img in img_fetcher.imgs:
            print('ren %s %02d.jpg' % (img, counter))
            counter += 1
lohness
129 / 101 / 5
Регистрация: 24.04.2008
Сообщений: 930
22.11.2013, 19:24  [ТС]     стоит связываться или это не задачка для начинающих? #17
Цитата Сообщение от 0x10 Посмотреть сообщение
Не для холивара, но решать такие задачи на голых плюсах - изврат. Аналогичное решение на питоне, втрое компактнее

Очень может быть но если с С я еще хотя бы шапочно знаком, то про Питон знаю что такой есть и всё
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2013, 23:29     стоит связываться или это не задачка для начинающих? #18
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
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    ifstream fin("input.html");
    if (!fin) cout << "Error fin!" << endl;
    else
    {
        ofstream fout("out.txt");
        if (!fout) cout << "Error fout!" << endl;
        else
        {
            string str;
            int number = 1;
            while (getline(fin, str))
            {
                string::size_type n = str.find("orig.jpg");
                if (n != string::npos)
                {
                    str.erase(str.begin(), str.begin() + str.find('/') + 1);
                    str.erase(str.begin() + str.find('\"'), str.end());
                    
                    fout << "ren " << str << ' ' << number << ".jpg" << endl;
                    ++number;
                }
            }
            fout.close();
        }
        fin.close();
    }
    
    system("pause");
    return 0;
}

Входной файл ("input.html"):
Кликните здесь для просмотра всего текста
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html4...1224/loose.dtd">
<!-- saved from url=(0103)file://C:\JOB FOLDER\1111111\kid_book_museum Эмма Мошковская Шла дорогой крынка_ Художник В_Чижиков.htm -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html4...ose.dtd"><HTML
lang="en" lang="en" xml:lang="en"
xmlns="http://www.w3.org/1999/xhtml"><HEAD><META content="IE=10.000"
http-equiv="X-UA-Compatible">
<META http-equiv="X-UA-Compatible" content="IE=10.000">
<META http-equiv="Content-Type" content="text/html; charset=windows-1251">
<TITLE>kid_book_museum: Эмма Мошковская "Шла дорогой крынка". Художник
В.Чижиков</TITLE>
<META name="GENERATOR" content="MSHTML 10.00.9200.16736"></HEAD>
<BODY class="home">
<H1 class="b-singlepost-title">Эмма Мошковская "Шла дорогой крынка". Художник
В.Чижиков </H1><ARTICLE class="b-singlepost-body"> В детстве у меня было много
вот таких книжек-малышек. Я называла их веселые гармошки.<BR>Эта книжечка из
ранних работ Виктора Чижикова.<BR>Сканировать сложно, так как читать
стихотворение и смотреть картинки нужно развернув всю
ленту.<BR><BR><B>Э.Мошковская "Шла дорогой крынка"</B><BR>Издательство Детский
мир 1962 год<BR><B>Художник В.Чижиков</B><BR>Тираж 20000<BR>книжечка
миниатюрного формата 8х10,5 см<BR>3-я ф-ка офсетн.печати ЛСНХ<BR>г.Ленинград,
пр.Обуховской обороны,110<BR>Обложка из плотного картона <BR>(может поэтому ей
ничего не делается)<BR><BR><A href="http://fotki.yandex.ru/users/algumascoisas/view/850930/"
rel="nofollow"><IMG width="800" height="534" title="" alt="" src="kid_book_museum%20Эмма%20Мошковская%20Шла%20дорогой%20к рынка_%20Художник%20В_Чижиков_files/0_cfbf2_39396e7_orig.jpg"
border="0"></A><BR><BR><A name="cutid1"></A> <BR><A href="http://fotki.yandex.ru/users/algumascoisas/view/850931/"
rel="nofollow"><IMG width="800" height="532" title="" alt="" src="kid_book_museum%20Эмма%20Мошковская%20Шла%20дорогой%20к рынка_%20Художник%20В_Чижиков_files/0_cfbf3_931d3197_orig.jpg"
border="0"></A><BR><BR><BR><A href="http://fotki.yandex.ru/users/algumascoisas/view/850932/"
rel="nofollow"><IMG width="800" height="294" title="" alt="" src="kid_book_museum%20Эмма%20Мошковская%20Шла%20дорогой%20к рынка_%20Художник%20В_Чижиков_files/0_cfbf4_22ba9201_orig.jpg"
border="0"></A><BR><BR><BR><A href="http://fotki.yandex.ru/users/algumascoisas/view/850933/"
rel="nofollow"><IMG width="800" height="291" title="" alt="" src="kid_book_museum%20Эмма%20Мошковская%20Шла%20дорогой%20к рынка_%20Художник%20В_Чижиков_files/0_cfbf5_12b53a87_orig.jpg"
border="0"></A><BR></ARTICLE></BODY></HTML>

Выходной файл("out.txt"):
ren 0_cfbf2_39396e7_orig.jpg 1.jpg
ren 0_cfbf3_931d3197_orig.jpg 2.jpg
ren 0_cfbf4_22ba9201_orig.jpg 3.jpg
ren 0_cfbf5_12b53a87_orig.jpg 4.jpg
Max Dark
22.11.2013, 23:37
  #19

Не по теме:

Эм... А зачем создавать батник, если средствами стандартных библиотек можно сразу переименовать?

OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.11.2013, 23:51     стоит связываться или это не задачка для начинающих? #20
А давайте сыграем в гольф?
Bash
1
grep -Eo '[^/]+orig.jpg' source.html | awk 'BEGIN{a=1}{printf "ren %s %02d.jpg\n", $0, a++}' > bat.bat
alsav22
23.11.2013, 05:08
  #21

Не по теме:

Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
А давайте сыграем в гольф?
Такой хоккей нам не нужен...

lohness
129 / 101 / 5
Регистрация: 24.04.2008
Сообщений: 930
23.11.2013, 08:51  [ТС]     стоит связываться или это не задачка для начинающих? #22
Цитата Сообщение от Cra3y Посмотреть сообщение

Не по теме:

Эм... А зачем создавать батник, если средствами стандартных библиотек можно сразу переименовать?

Так я в начале и спрашивал про это тоже.
Оптимально ввести только ссылку а прога сама уже будет вытаскивать оригиналы и переименовывая их складывать в нужную папку
Но так как в программировании не силен то ограничился задачей, которую, как мне кажется, смогу понять-осилить.
тем более что на яндексе есть нюансы - не всегда имеются файлы xxxxx_orig.jpg иногда максимальное разрешение xxx_XXXL.jpg
т.е. еще надо вводить доп проверки на наличие оригиналов.ну и добавлять GUI для красоты и удобства

так что прога станет довольно навороченной и явно не для новичков кмк


Начну пока с понимания более-менее простой конструкции
0x10
23.11.2013, 09:34
  #23

Не по теме:

Цитата Сообщение от lohness Посмотреть сообщение
так что прога станет довольно навороченной и явно не для новичков
Да нет тут ничего сверхъестественного. сделать запрос на указанный урл, стянуть html, распарсить, получить урлы изображений, сохранить под новыми именами. Просто писать такое лучше с использованием более высокоуровневых инструментов.

lohness
129 / 101 / 5
Регистрация: 24.04.2008
Сообщений: 930
25.11.2013, 13:15  [ТС]     стоит связываться или это не задачка для начинающих? #24
Пытаюсь вместо

ifstream fin("input.html");

сделать ручной ввод имени файла:


char filename[25];
cout << "\n Введите имя файла (input.html): ";
cin >> filename;
cout <<
"Посмотрите на Ваши данные : ";
cout << filename;
cout <<
"\n";




ifstream fin(filename);
if (!fin) cout << "Ошибка исходного файла!" << endl;
.......

в результате все время ошибка исходного файла

что делаю не так?
newbie666
Заблокирован
25.11.2013, 13:24     стоит связываться или это не задачка для начинающих? #25
C++
1
2
3
4
5
6
7
8
9
10
11
std::string filename;
std::cout << "\n Введите имя файла (input.html): ";
std::cin >> filename;
std::cout << "Посмотрите на Ваши данные : "; 
std::cout << filename << std::endl;
std::fstream fs(filename.c_str(), std::ios::in);
if(fs.is_open())
{
    //делаем что надо
    fs.close();
}
Добавлено через 19 секунд
так надо
lohness
129 / 101 / 5
Регистрация: 24.04.2008
Сообщений: 930
25.11.2013, 13:33  [ТС]     стоит связываться или это не задачка для начинающих? #26
заработало когда вошел в папку с готовым экзешником, а не работает из компилятора

ну и char сменил на string
newbie666
Заблокирован
25.11.2013, 13:34     стоит связываться или это не задачка для начинающих? #27
Цитата Сообщение от lohness Посмотреть сообщение
заработало когда вошел в папку с готовым экзешником, а не работает из компилятора
что значит из компилятора?
lohness
129 / 101 / 5
Регистрация: 24.04.2008
Сообщений: 930
25.11.2013, 13:51  [ТС]     стоит связываться или это не задачка для начинающих? #28
в студии по F5

полазил по настройкам назначив рабочий каталог туда где лежит готовый экзешник теперь и из студии заработало

Добавлено через 1 минуту
пол дня потратил на то чтобы понять почему правильный код не работал
newbie666
Заблокирован
25.11.2013, 13:58     стоит связываться или это не задачка для начинающих? #29
Цитата Сообщение от lohness Посмотреть сообщение
пол дня потратил на то чтобы понять почему правильный код не работал
можно вводить полный путь к файлу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 14:36     стоит связываться или это не задачка для начинающих?
Еще ссылки по теме:

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


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

Или воспользуйтесь поиском по форуму:
lohness
129 / 101 / 5
Регистрация: 24.04.2008
Сообщений: 930
25.11.2013, 14:36  [ТС]     стоит связываться или это не задачка для начинающих? #30
в самой программе или когда запрашивается программой?
Yandex
Объявления
25.11.2013, 14:36     стоит связываться или это не задачка для начинающих?
Ответ Создать тему
Опции темы

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