[java] EOL & EOF??

Pagina: 1
Acties:

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 27-05 12:59
Ik heb een bestandje dat ik per karakter in wil lezen. Een eerder gemaakt programmaatje in Pascal gebruikt de Eoln en Eof functies om te inspecteren of resp. einde van de regel / einde van de file bereikt is. Dit hele ding wil ik omschrijven naar Java, maar ik kom er niet uit hoe je zoiets (toch vrij simpels?) op kunt lossen.

Het is dus wel essentieel dat er per karakter gelezen wordt. Wat ik had in pascal was van de volgende vorm:

code:
1
2
3
4
5
6
7
8
9
while not Eof ( f ) do begin { verwerk eerstvolgende regel }

   while not Eoln ( f ) do begin { verwerk eerstvolgende teken }
        read ( f, teken )
   end
 
   ; readln (f)

end


Even versimpelt om het idee duidelijk te maken.

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

ik zou het met een BufferedInputStream doen:

http://java.sun.com/j2se/...edInputStream.html#read()

[ Voor 5% gewijzigd door Erkens op 27-12-2003 17:18 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
Ik ken eigenlijk geen Pascal, maar ik denk dat je zoiets zal willen (ongetest):

Java:
1
2
3
4
5
6
7
8
9
10
BufferedReader input = new BufferedReader(*je reader*);
String line;
while((line = input.readLine()) != null)
{
   for(int i=0; i < line.length(); i++)
   {
      char character = line.charAt(i);
      // verwerk character
   }
}

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Ik neem aan dat je geen binaire data aan het inlezen bent?
In dit geval kun je het beste gebruik maken van character input streams, zie http://java.sun.com/j2se/1.4.2/docs/guide/io/io.html

Gebruik voor optimale performance een BufferedReader. Deze methode kent ook een readline functie om regel voor regel in te lezen.

It’s nice to be important but it’s more important to be nice


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 27-05 12:59
Te gek mensen, hiermee gaat het wel lukken denk ik, heb vandaag geen tijd meer om het af te maken maar verwacht verder geen problemen meer.

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 27-05 12:59
Nog een klein vraagje + schop.

Het lezen is (denk ik) gelukt, maar ik heb nu problemen met een van mn functies. Ik roep deze aan op de volgende manier binnen m'n class:

code:
1
this.countText(inFile, aantalRegels, aantalWoorden, aantalGetallen, aantalTekens);


Met de typering:

code:
1
2
int aantalTekens, aantalRegels, aantalWoorden, aantalGetallen;
  BufferedReader inFile;


Maar wanneer ik dan iets verander in die functie:

code:
1
 public void countText(BufferedReader f, int regels, int woorden, int getallen, int tekens) throws IOException {


zijn de variabelen na uitvoering nog steeds gewoon 0. Waarom worden die waarden niet veranderd, of moet je dan per se de functie een resultaat laten geven met daarin de waardes? In Pascal hoefde dat niet zolang je alleen iets wilt veranderen aan de variabelen die je ook meegeeft aan je functie (of methode eigenlijk).

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
In Java zijn al je primitieven (int/byte/char/short/bool/float/double) altijd by value doorgegeven en zijn dus copien die aan het eind van de functie vernietigd worden.
Classes worden altijd by reference doorgegeven, en daarin kan dus gewijzigd worden.

Het punt is dus dat jij een returnvalue zal moeten teruggeven en die zal vier wardes moeten omvatten ( denk ik: regels, woorden, getallen, tekens). Waarom wrap je die dan niet in een class?
Evt zou je er voor kunnen kiezen om een class met de huidige waardes mee tegeven, maar dat hoeft niet. Een voordeel daarvan is dan wel dat je kan optellen.

Of je dan gaat wijzigen in die class moet je zelf weten, als je het maar goed documenteerd.

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 27-05 12:59
Zou je daar even een snel voorbeeldje van kunnen geven? Snap het niet helemaal. Alles wat ik doe gebeurd al binnen dezelfde klasse, is er niet een manier waarop ik aan kan geven dat het om 1 en dezelfde waardes gaat, dus zodra die methode iets veranderd dat voor de hele klasse moet gebeuren? Heb het al geprobeerd met this. maar dat schijnt niets uit te maken. Returnen is natuurlijk de snelste en makkelijkste oplossing, maar het leek me dat het zo ook wel moest kunnen, vind ik persoonlijk netter.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

De variabelen worden idd passed-by-value. Bij primitives worden de waardes doorgegeven, niet het geheugenadres waar ze staan. Bij objecten wordt het geheugenadres doorgegeven, waardoor die veranderingen wel doorwerken. Behalve als je het object een nieuw geheugenadres toewijst (f =new BufferedReader())

edit:
Sneller typen :(

[ Voor 5% gewijzigd door kenneth op 31-12-2003 11:07 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 27-05 12:59
Zoals gewoonlijk was ik weer moeilijk aan het doen, als je die methode niets meegeeft, en in de body dezelfde variabele namen gebruikt als in je klasse gaat ie die netjes updaten. Meer was niet nodig :)

Verwijderd

Alles gewoon kenbaar maken voor de volledige klasse als je ze nodig hebt op 1 plaats is niet echt netjes, waarom gebruik je niet Integer ipv int ? dan ben je van de primitieve type af en heb je een object, die dan doorgegeven wordt byref

(naar ik las in de andere reacties zou een Object byref moeten worden meegegeven. Integer is een Object, int is primitief)
Pagina: 1