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?
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.
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?
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; }
Hupsis, ajattelin tilannetta, jossa tavaraa lähetettäisiin suoraan selaimelle, eikä kirjoiteta tiedostoon.
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.
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.