yritän käsitellä koodissani(c++) tekstitiedostoa. miten saisin laskettua ja talletettua tiedoston rivien määrän johonki muuttujaan? ei varmaan vaikee ongelma, mut aloittelijalle kuitenki vaikea.
Kun sitä tiedostoa luetaan niin sehän lukee aina rivin kerrallaan. Sinun tarvitsee vain laittaa rivin luvun jälkeen muuttuja joka nousee yhdellä.
Alkuun:
int rivit;
Väliin:
rivit++;
;D
kuulostaa helpolta, mut ei onnistu minulta:(.
tämmösen luku koodin koppasin yhestä kirjasta ja yritin mut ei niin ei.
CFile fileEditText; if (fileEditText.Open("C:\\MyFile.txt",CFile::modeRead)) { int rivit; char cBuf[1024]; UINT uBytesRead; while(uBytesRead = fileEditText.Read(cBuf,sizeof(cBuf)-1)) { rivit++; cBuf[uBytesRead] = NULL; m_EditBox1 += CString(cBuf); m_EditBox4 += int(rivit); } fileEditText.Close(); UpdateData(FALSE); }
Tässä C-oppaan luvussa on kerrottu tiedoston luvusta.
Nuo luokat joita käytät tuossa pätkässä taitavat kuulua MFC:en. Tein pienen esimerkin(toivottavasti on oikein):
#include <iostream> #include <fstream> using namespace std; int main() { ifstream tiedosto("teksti.txt"); int rivimaara = 0; if(!tiedosto) { cout << "Tiedoston avaus epäonnistui!" << endl; return 1; } string buf; // Luetaan loppuun asti while(!tiedosto.eof()) { // Luetaan rivi, kasvatetaan rivimäärää ja tulostetaan rivi std::getline(tiedosto, buf); rivimaara++; cout << buf << endl; } // Tulostetaan rivimäärä. cout << rivimaara << endl; return 0; }
Rivin lopusta löytyy (tavuina) joko 0x0a tai 0x0d tai molemmat, käyttöjärjestelmästä riippuen. MFC:tä ei missään nimessä kannattaisi minustakaan käyttää; joko fstream tai WinAPI:n tiedostofunktiot. Joka tapauksessa, noita tavuja joudut sieltä laskemaan.
Metabolix: miksi ei MFC:tä? Kyllähän ne monesti ovat paljon kätevämpi vaihtoehto kuin suoraan WinAPI:lla leikkiminen.
juvonen: tuossa kopioimassasi esimerkissä ei ole oikein mitään järkeä :) Helpoin tapa olisi lienee lukea koko tiedosto kerralla johonkin bufferiin, ja sieltä tosiaan laskea rivinvaihtojen (\r\n tai lunixissa \n) määrä.
juvosen koodi ei toimi tarkoitetulla tavalla, koska siinä ei lueta rivi kerrallaan, vaan puskurin koko kerrallaan. Niinpä rivit-muuttujaan ei tallennu rivien määrä vaan luettujen puskurillisten määrä. Koodin saa toimimaan jos luetaan koko tiedosto ensin CString-muuttujaan ja etsitään sen jälkeen toisessa silmukassa kuinka monta kertaa merkkijonosta löytyy merkki 0x0A ja tähän lisätään yksi, koska viimeisen rivin lopussa ei ole rivinvaihtoa. Tällä tavalla ohjelma tulee kuitenkin aika hitaaksi, jos tekstiä on paljon. Toinen tapa on lukea rivi kerrallaan firebugin esimerkin mukaan.
Jos tekee MFC-sovellusta niin kannattanee käyttää MFC:n omia työkaluja, ei muuten.
Meca: toisaalta viimeisen rivin lopussa *voi* kyllä olla rivinvaihto että se on nyt ihan koodaajasta kiinni miten ne laskee.
Aihe on jo aika vanha, joten et voi enää vastata siihen.