/*
Opis:
Program ma za zadanie wyciagnac znaczniki IMG z podanego jako pierwszy paramter pliku html.
Jezeli zostanie podany drugi parametr, to program zapisze dane do plik out.txt, nie
wyswietlajac zadnych informacji na ekranie.
Opis działania:
1 - odczyt pliku html z usunieciem znakow entera
2 - wyciagniecie pelnego znacznika IMG html
3 - wyciagniecie nazwy obrazka oraz opisu alt
4 - wyswietlenie lub zapis do pliku
Wywolanie:
- wyswietlenie na ekran
zad3.exe test.html
- zapis do pliku
zad3.exe test.html out
*/
Source code:
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <string>
#include <vcl.h>
#include <fstream>
#include <iostream>
#include <dir.h>
using namespace std; /* dyrektywa użycia standardowej przestrzeni nazw */
#pragma hdrstop
#pragma argsused
// definicje opisu bledow
#define error1 0 /* brak parametrow*/
#define error2 1 /* za duzo parametrow */
#define error3 2 /* brak pliku pierwszego parametru */
#define error4 4 /* podany plik wejsciowy nie czyta sie */
#define error5 5 /* podany plik wyjsciowy nie zapisuje sie */
/*
procedury zdefiniowane przez uzytkownika
*/
void show_error_messeage( int err_code ); // wystwietla bledy na stdout
void czytaj_plik ( char * file_name ); // czyta dane z pliku
void szukaj_znacznikow( string plik); // szuka pelnego nnacznika html
void zapisz_do_pliku(string obrazek, string opis);// zapisuje poszczegolne linie do pliku
string szukaj_alt_obrazka( string znacznik); // wyciaga z podanej lini opis alt obrazka
string szukaj_obrazka( string znacznik); // wyciaga z podanej lini nazwe obrazka
int plik_istnije( char * file_name ); // sprawdza czy plik istnieje na dysku
bool czy_zapisac_do_pliku; // jezeli true - zapis do pliku, 2 par / false - brak zapisu, 1 par
int main(int argc, char* argv[])
{
system("cls"); // czysci ekran
int ile_par = argc - 1 ; // ile parametrow przy uruchomieniu
if ( ile_par == 1)
// wyswietla dane na ekranie
{
if (! plik_istnije(argv[1]))
{
show_error_messeage(2);
}
else
{
czy_zapisac_do_pliku = false;
czytaj_plik(argv[1]);
}
}
else if (ile_par == 2)
// zapisuje dane do pliku
{
if (! plik_istnije(argv[1]))
{
show_error_messeage(2);
}
else
{
czy_zapisac_do_pliku = true;
czytaj_plik(argv[1]);
}
}
else if ( ile_par == 0 )
{
show_error_messeage(error1);
}
else
{
show_error_messeage(error2);
}
puts("");
system("PAUSE");
return EXIT_SUCCESS;
}
void show_error_messeage( int err_code )
{
switch( err_code )
{
case error1 : puts("");
puts( "Brak parametrow wywolania programu!" );
puts( "Prawidlowo: nazwa_pliku_html znacznik_otwierajacy " );
break;
case error2 : puts("");
puts( "Za duzo parametrow wywolania programu!" );
puts( "Prawidlowo: nazwa_pliku_html znacznik_otwierajacy " );
break;
case error3 : puts("");
puts( "Brak pliku podanego jako pierwszy parametr!");
puts( "Prawidlowo: nazwa_pliku_html znacznik_otwierajacy " );
break;
case error4 : puts("");
puts( "Podany plik nie da sie otworzyc do odczytu!");
break;
default : puts("");
puts( "Wystapil nieznany blad." );
break;
}
}
int plik_istnije( char * file_name )
// sprawdza czy istnieje plik na hdd
{
return ( access( file_name, 0 ) == 0 );
}
void zapisz_do_pliku(string obrazek, string opis)
// zapisuje jedna linie w pliku
{
string tmp;
tmp = obrazek + opis;
FILE *file_out;
if ((file_out = fopen("out.txt", "at")) == NULL)
{
show_error_messeage(5);
}
else
{
int x = (tmp.length());
cout << tmp;
for (int y = 0; y <= x-1 ; y++)
{
fputc(tmp[y], file_out);
}
}
fclose(file_out);
}
void czytaj_plik ( char * file_name )
// czyta plik i zapisuje go do jednej lini z pominieciem entera,
// dane sa w jednej lini
{
char znak;
string plik_html;
FILE *file_in;
if ((file_in = fopen(file_name, "rt")) == NULL)
{
show_error_messeage(4);
}
else
{
while (!feof(file_in))
{
znak = fgetc(file_in);
if (znak == '\n')
{
znak = NULL;
}
plik_html = plik_html + znak;
}
plik_html = plik_html;
szukaj_znacznikow( plik_html);
}
fclose(file_in);
}
string szukaj_obrazka( string znacznik)
// z przekazanej lini wyciaga dane dotyczace nazwy obrazka
{
string obrazek;
string tmp;
znacznik.erase(1,3+znacznik.find("SRC=\""));
obrazek = znacznik.substr(2,(znacznik.find("\"",2))-2);
tmp = "O: ";
tmp = tmp + obrazek;
tmp = tmp + "\n";
return tmp;
}
string szukaj_alt_obrazka( string znacznik )
// z przekazanej lini wyciaga dane dotyczace alternatywnej nazwy obrazka
// jezeli jej brak to zapisuje --- brak alt ---
{
string opis;
string tmp;
znacznik.erase(1,3+znacznik.find("ALT=\""));
opis = znacznik.substr(2,(znacznik.find("\"",2))-2);
if (!(opis.length() > 0) )
{
opis = "--- brak alt ---";
}
tmp = "A: ";
tmp = tmp + opis;
tmp = tmp + "\n";
return tmp;
}
void szukaj_znacznikow( string plik )
// szuka znacznik img
// tworzy jedna linie zawierajaca caly jeden znacznik img z html
{
string znacznik;
while (plik.length() > 0)
{
int pozycja_pocz_img = plik.find("IMG");
int pozycja_kon_img = 0;
if (pozycja_pocz_img > 0)
{
plik.erase(1, pozycja_pocz_img -1);
pozycja_kon_img = plik.find("\">")+2;
znacznik = plik.substr(0, pozycja_kon_img);
plik.erase(1, pozycja_kon_img);
if (!czy_zapisac_do_pliku) {
cout << szukaj_obrazka(znacznik);
cout << szukaj_alt_obrazka(znacznik);
}
else
{
zapisz_do_pliku(szukaj_obrazka(znacznik), szukaj_alt_obrazka(znacznik));
}
}
else
{
plik.erase(0, plik.length());
}
}
}
Zadanie: Zad3 - wyciagnąć znaczniki IMG i ALT z html |
Program na zaliczenie Laboratorium PODSTAWY I JĘZYKI PROGRAMOWANIA |
Grupa: 3BZ / WSTI |
Student: Robert Ruszel (112) |
Strona 1 z 5