Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: teksititiedoston rivien määrä

Sivun loppuun

juvonen [26.08.2004 09:30:29]

#

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.

rndprogy [26.08.2004 10:14:25]

#

Kun sitä tiedostoa luetaan niin sehän lukee aina rivin kerrallaan. Sinun tarvitsee vain laittaa rivin luvun jälkeen muuttuja joka nousee yhdellä.

Antti [26.08.2004 10:17:33]

#

Alkuun:
int rivit;

Väliin:
rivit++;

;D

juvonen [26.08.2004 15:20:59]

#

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);
}

rndprogy [26.08.2004 15:33:20]

#

Tässä C-oppaan luvussa on kerrottu tiedoston luvusta.

firebug [26.08.2004 15:34:30]

#

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;
}

Metabolix [26.08.2004 16:25:53]

#

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.

thefox [26.08.2004 23:07:44]

#

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ä.

Meca [27.08.2004 09:50:12]

#

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.

thefox [27.08.2004 10:42:55]

#

Meca: toisaalta viimeisen rivin lopussa *voi* kyllä olla rivinvaihto että se on nyt ihan koodaajasta kiinni miten ne laskee.


Sivun alkuun

Vastaus

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

Tietoa sivustosta