Informatică, întrebare adresată de Tudorica69, 9 ani în urmă

Tocmai m-am angajat la o firma de soft si prima mea sarcina este sa scriu un program care sa converteasca documente HTML in text simplu. Documentele HTML contin pe langa textul care ma intereseaza si tag-uri de formatare. Orice tag de formatare din documentele mele incepe cu o eticheta de inceput de forma <...> (unde prin ... am notat numele tagului si eventualele sale atribute) si se termina cu o eticheta de sfarsit de forma </...> (unde ... reprezinta numele tag-ului). Ceea ce este cuprins intre eticheta de inceput si cea de sfarsit poate fi text simplu, sau text formatat cu ajutorul altor tag-uri de formatare. In documentele mele poate aparea si text simplu care nu este cuprins intre etichetele unui tag de formatare. In documente, imbricarea tag-urilor este corecta (nu va fi inchis un tag daca exista un tag interior lui care nu a fost inca inchis), iar in interiorul unei etichete nu poate aparea o alta eticheta.

Cerinta

Fiindca eu nu am reusit, scrieti un program care sa converteasca un document HTML in text simplu!

Date de intrare

Fisierul de intrare convert.in contine documentul HTML.

Date de iesire

Fisierul de iesire convert.out va contine textul simplu care se afla in documentul HTML, structurat pe linii si spatiat in acelasi mod.

Restrictii si precizari

Daca pe o linie din fisierul de intrare nu se afla text simplu, in fisierul de iesire va corespunde o linie goala.

Exemplu

convert.in
<html><head><title>vasile</title></head>
<body>
mult text
<p>un paragraf</p><p> alt paragraf<a href=
"http://www.liis.ro"> 
liceul meu </a> si iar text </p> </body>
</html>


convert.out
vasile

mult text
un paragraf alt paragraf
 liceul meu  si iar text


artur99: Woow, faceți la info așa ceva? :))
Tudorica69: Sunt a 10a, dar am uitat sa schimb din gimnaziu in liceu:))
artur99: A, păi da, la liceu zic :)))

Răspunsuri la întrebare

Răspuns de artur99
3
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main(){
    ifstream in("convert.in");
    char s[200];
    bool in_tag = 0;
    int tag_starts = 0;
    
    while(in.getline(s, 200)){
        for(int i=0;i<strlen(s);i++){
            if(!in_tag && s[i] == '<'){
                in_tag = 1;
                tag_starts = i;
            }else if(in_tag && s[i] == '>'){
                in_tag = 0;
                strcpy(s+tag_starts, s+i+1);
                i = tag_starts-1; //Sari inapoi la inceputul textului sters
            }
        }
        if(in_tag){
            strcpy(s+tag_starts, s+strlen(s));
            // in_tag ramane la fel pentru urmatorul text.
            tag_starts = 0;
        }
        cout<<s<<endl;
    }
}

artur99: Cred că te descurci să muți pe fișier. Am făcut cu fișier doar la citire
artur99: Dacă nu înțelegi ceva, întreabă
Tudorica69: E perfect, mersi mult
Tudorica69: Lucrez acum pentru olimpiada, smabata am municipala
Tudorica69: sambata*
artur99: Aa, super. Mult succes! :D
Tudorica69: while(fin.getline(s, 200)) nu va citi doar prima linie?
artur99: Ba da, citește prima linie, apoi la a doua iterație citește următoarea linie, și tot așa. Până când returnează false(s-a terminat fișierul), și iese din while.
artur99: Merge pe fiecare linie pe rând :))
Tudorica69: Mersi mult de ajutor, daca mai ai cumva niste timp liber, am mai pus niste intrebari cu probleme care mi-au creat dificultati, poate te uiti peste ele :D
Alte întrebări interesante