Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ HTML loki

Sivun loppuun

DrDeath [30.06.2010 22:03:45]

#

o hai thar!

Ajattelin muuttaa oman tekstilokini html muotoiseksi, jotta saisin väritettyä erilaisia raportteja eri tavoilla.

Ongelmana tässä on se, että kun tämä loki on tarkoitettu tilanteeseen, jossa ohjelma todennäköisesti kaatuu tai jumittuu, niin miten saan kirjotettua sen loppu </html> jne. osan siihen html-tiedostoon?

Jos esim. normaalisti tulostuisi näin

[INFO] ptr == 0x401000
[VIRHE] ptr2 == 0x0

jos ohjelma kaatuu tässä niin kaikki on ok.

Haluaisin tulostaa lokin näin

<html>
<body>
<p id="info">[INFO] ptr == 0x401000</p>
<p id="virhe">[VIRHE] ptr2 == 0x0</p>
jos ohjelma kaatuu tässä niin lopetusmerkit eivät tulostu:
</body>
</html>

onko olemassa mitään järkevää tapaa, jolla lopetusmerkit saisi tulostumaan?

Antti Laaksonen [30.06.2010 22:36:52]

#

Helppo ratkaisu on jättää lopetustagit pois, koska ne eivät vaikuta siihen, miten selaimet näyttävät sivun.

Jos kuitenkin haluat lopetustagit, voit tulostaa ne jokaisen merkinnän jälkeen ja kelata ennen uutta merkintää takaisinpäin tiedoston kirjoituskohtaa. C:ssä kelaus onnistuu funktiolla fseek, ja C++:ssa lienee vastine tälle.

Grez [30.06.2010 22:47:30]

#

Jos ohjelma jumiutuu, niin en ymmärrä miten Antin ehdottama toimisi. (Eihän se pahemmin kelaile streameja jos se on jossain toisaalla ikiloopissa)

Jos taas ohjelma kaatuu, niin eikö moinen kaatuminen kannattaisi kopata ja sitten vaikka finallyssä tunkaista noi lopetusmerkit, jos ei parempaa keksi?

Antti Laaksonen [30.06.2010 23:13:34]

#

Tällainen ratkaisu oli mielessäni:

#include <stdio.h>

FILE *tied;

void merkinta(char *teksti) {
    fseek(tied, -16, SEEK_CUR);
    fprintf(tied, "%s\n", teksti);
    fprintf(tied, "</body></html>\n");
    fflush(tied);
}

int main(void) {
    int luku;
    tied = fopen("virheet.txt", "w");
    fprintf(tied, "<html><body>\n");
    fprintf(tied, "</body></html>\n");
    merkinta("ALKU");
    printf("Anna luku: ");
    scanf("%i", &luku);
    merkinta("LUKU LUETTU");
    /* jos luku on 0, ikuinen silmukka */
    if (luku == 0) {
        while (1);
    }
    merkinta("LOPPU");
    return 0;
}

Grez [30.06.2010 23:18:30]

#

Hupsis, ajattelin tilannetta, jossa tavaraa lähetettäisiin suoraan selaimelle, eikä kirjoiteta tiedostoon.

jlaire [01.07.2010 20:11:20]

#

Itse jättäisin lokin tekstimuotoon ja kirjoittaisin skriptin, joka tekee siitä kivan näköisen HTML-tiedoston. Jos haluaa joskus muuttaa HTML:n rakennetta tai lisätä uuden tiedostomuodon, se onnistuu helposti eikä vaadi mitään muutoksia varsinaiseen C++-ohjelmaan.

Modulaarisuus, tee yksi asia ja tee se hyvin, jne.

DrDeath [01.07.2010 23:12:48]

#

Kiitos vastauksista!

Tuo Antin ratkaisu saattaisi olla juuri sopiva.

funktio, c++-ohjelmaan teen joka tapauksessa jatkuvasti muutoksia, joten tuo ei haittaa. Toisaalta, jos jokin erillinen skripti/ohjelma muuttaisi tekstitiedoston html-muotoon, niin sen pitäisi jotenkin kyetä selvittämään milloin tiedosto pitää muuttaa. Jos skripti esim. odottaisi tiedoston sulkemista, niin tiedostoa ei voisi sulkea aina kirjoituksen jälkeen. Tämä taas aiheuttaisi sen, että visual studio ei tajuaisi milloin tiedosto on muuttunut ja milloin se pitäisi ladata uudestaan.

Teuro [02.07.2010 08:38:43]

#

DrDeath kirjoitti:

funktio, c++-ohjelmaan teen joka tapauksessa jatkuvasti muutoksia, joten tuo ei haittaa.

Ohjelmasi kehitys vaan suuntautuu mahdollisesti väärään suuntaan, jos joudut miettimään tällaista asiaa.

DrDeath kirjoitti:

Jos skripti esim. odottaisi tiedoston sulkemista, niin tiedostoa ei voisi sulkea aina kirjoituksen jälkeen. Tämä taas aiheuttaisi sen, että visual studio ei tajuaisi milloin tiedosto on muuttunut ja milloin se pitäisi ladata uudestaan.

Kyllähän tiedoston voi sulkea ja avata taas (loppuun)kirjoitusta varten ohjelmassa. Erillinen scripti taasen voidaan ajaa vaikka ajastetusti kerran vuorokaudessa ja generoida uusi html-tiedosto. Ei kai tässä ole mitään ongelmaa. Varsinainen ohjelmahan kirjoittaa logia sitä mukaa, kun kirjoitettavaa ilemenee.

Torgo [02.07.2010 13:29:12]

#

Teuro kirjoitti:

DrDeath kirjoitti:

funktio, c++-ohjelmaan teen joka tapauksessa jatkuvasti muutoksia, joten tuo ei haittaa.

Ohjelmasi kehitys vaan suuntautuu mahdollisesti väärään suuntaan, jos joudut miettimään tällaista asiaa.

Tuskinpa. Jos tiedostoon kirjoitetaan debug-logia ja ideana on värittää eri tekstejä eri väreillä, niin eipä se kyllä voi itse ohjelman kehitystä väärään suuntaan viedä millään. Siinä tekstitiedostossa täytyisi joka tapauksessa olla tieto muotoilusta mukana. Aivan samalla tavalla se kulkee siinä, oli se sitten tekstitiedosto tai html. HTML:n voi aina muotoilla uudestaan css:n avulla. Ja tuo kirjoituskin on vain yksi funktio kummassakin tapauksessa. Ei siinä tule ylläpidollisestikaan mitään etua. Jos aivan väkisin halutaan jo valmiin dokumentin rakenteeseen muutoksia, niin se onnistuu ihan yhtälailla skriptin avulla kuin tekstitiedostossakin.

Teuro kirjoitti:

DrDeath kirjoitti:

Jos skripti esim. odottaisi tiedoston sulkemista, niin tiedostoa ei voisi sulkea aina kirjoituksen jälkeen. Tämä taas aiheuttaisi sen, että visual studio ei tajuaisi milloin tiedosto on muuttunut ja milloin se pitäisi ladata uudestaan.

Kyllähän tiedoston voi sulkea ja avata taas (loppuun)kirjoitusta varten ohjelmassa. Erillinen scripti taasen voidaan ajaa vaikka ajastetusti kerran vuorokaudessa ja generoida uusi html-tiedosto. Ei kai tässä ole mitään ongelmaa. Varsinainen ohjelmahan kirjoittaa logia sitä mukaa, kun kirjoitettavaa ilemenee.

Tiedoston jatkuvaa availua ja sulkemista ei kannata tarpeettomasti tehdä. Pelkästään tiedoston avaus kirjoitusta varten ja sulkeminen syövät yllättävän ahnaasti ohjelman suoritusaikaa. Ja sitä logia halutaan yleensä lukea ohjelman suorituksen jälkeen, eikä suinkaan ajastetusti kerran vuorokaudessa. Minusta siinä on jo kaksi ongelmaa. Kolmas on se että tarvitaan väliin yksi turha palikka saavuttamatta mitään hyötyä. Skriptit on hyödyllisiä kun niillä helpotetaan tai automatisoidaan tehtäviä, jotka olisi manuaalisesti hankala tai työläs tehdä. Tässä tapauksessa mielestäni niillä yritetään tehdä simppelistä asiasta monimutkaisempia kuin mitä ne ovatkaan.

Esimerkkinä tiedoston avaamisesta/sulkemisesta loppuunkirjoitusta varten:

John Blanton kirjoitti:

Conducting performance tests of several porting tools we noticed
dramatically poor performance for the following case using FAT16 on
Windows NT:

    for (count = 0; count < (int) REPETITIONS; count++)

    {

        fi = fopen("testfiles/file1", "a");

        fclose(fi);

    }

REPETITIONS is set to 100,000. The test requires over an hour to
complete.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta