» »

dvojna while zanka- problem

dvojna while zanka- problem

T(he) Boss ::

Imam sledeci problem. Naceloma delam to v javi, samo takse osnove so lahko tudi v c++ in podobnih jezikih. Imam dve vhodni txt datoteki in jih berem po vrsticah. Potem pa pride tak dvojna while zanka, ki ima za zacetek nalogo, samo da izpise na standardni izhod prvo vrstico prvega txt fajla, potem vse iz drugega, potem pa drugo in prvega in vse iz drugega in tako dalje. Problem pa je v tem, da izpise samo prvo vrstico iz prvega in vse iz drugega, potem pa se konca, ne vrne pa se na zacetek. Prilagam kodo in me zanima, zakaj je tako.

while ((s2= br2.readLine()) != null){
while ((s1=br1.readLine()) != null){

k.println(s2+" "+s1+"\n");
}
}

Ce pa katerokoli while zanko dam v komentar, pa drugo datoteko v celoti izpise.

P.S:k je objekt konzola, ki omogoca izpis šumnikov, ce to zamenjam z system.out je isto.:\

Vesoljc ::


vajl not end of file1
{
readline from file1;
printline;
vajl not end of file2
{
readline;
printline;
}
}

nekaj takega?
Abnormal behavior of abnormal brain makes me normal...

Zgodovina sprememb…

  • spremenil: Vesoljc ()

T(he) Boss ::

Aha, za izpisovanje bi to mogoce delovalo, bom jutri probal, samo jaz pa bom potem primerjal stringe in glede na to jih bom izpisoval.

T(he) Boss ::

No, zdaj sem malo spremenil in dobil zanimiv odziv :
while ((s2= br2.readLine()) != null){
k.println(s2);
while ((s1=br1.readLine()) != null){
k.println(s1+"\n");
}
}
Zdaj pa mi izpise prvo vrstico prvega, potem celo drugo datoteko, potem pa se drugo od 1 vrstice dalje. Torej je problem v tokovih, da se ne postavijo na zacetek datoteke, vsaj zdi se mi tako.

Vesoljc ::

neki smo spregledal, ja...
ko prideš do end of file-a, morš dat rewind, da se kazalec postavi na začetek...
Abnormal behavior of abnormal brain makes me normal...

T(he) Boss ::

Hvala, sem ze sam nekaj pogruntal v tej smeri, samo ne vem, ce je rewind metoda v javi. Samo to me se zanima, potem pa bom lahko nekaj casa spet v miru delal:D

kopernik ::

Že vnaprej te opozarjam, da kakšne hude telovadbe z BufferedReader-jem ne boš mogel izvajati. Sicer lahko postaviš oznako (metoda mark()) in se potem z metodo reset() vračaš na oznako, vendar moraš (no, je bolj zanesljivo) vnaprej vedeti, koliko znakov boš prebral. Skratka, s tem pristopom si lahko ustvariš pravo leglo zahrbtnih napak.

Raje preberi celoten fajl v en Collection in ga potem poljubno izpisuj.

noraguta ::

ja popolnama se strinjam z kopernikom.
se vec , ce je pomnilnika dovolj preberi boba fileta v pomnilnik.
ali vsaj drugega. ce ga ni itak ni uporabno alokacija pomnilnika ti zna porat prevec casa.ce mislis delat line per line.
Pust' ot pobyedy k pobyedye vyedyot!

Zgodovina sprememb…

  • spremenilo: noraguta ()

T(he) Boss ::

No, mogoce bi bilo res ucinkoviteje shraniti drugi fajl v ram (torej neki collection) samo bi se to zakompliciralo. Jaz rabim samo enostvano primerjanje vrstic, torej ce vrstica iz prve datoteke vsebuje katerokoli iz druge, bom obe izpisal in malo porezal stringe, drugace pa nic. Zanima me se samo to, kje tocno bi postal metodi mark() in rest(), ker mi nikakor ne uspe tega naredit, uspe mi samo ce vsakic ko preberem datoteke jo zaprem in potem pred ponovnim branjem zopet odprem.

kopernik ::

Jah, metodo mark() kličeš takrat, ko odpreš fajl (zato ker se želiš vračati na začetek) in nato po vsakem branju kličeš metodo reset().

T(he) Boss ::

Ce sem prav razumel bi to naj bilo tak:
FileReader in1 = new FileReader("datoteka1.txt");
BufferedReader br1 = new BufferedReader (in1);
FileReader in2 = new FileReader("datoteka2.txt");
BufferedReader br2 = new BufferedReader (in2);
String s1;
String s2;
br1.mark(0);
while ((s2= br2.readLine()) != null){
k.println(s2);

while ((s1=br1.readLine()) != null){
k.println(s1+"\n");
}
br1.reset();
Samo sedaj mi javi med izvajanjem (prevede brez napak) da je mark invalid.

Zgodovina sprememb…

kopernik ::

Jaz sem ta mark() zelo malo uporabljal (samo enkrat če se ne motim :) ) in še to sem potem spremenil.

V glavnem gre za to, da ti odpreš file in "kurzor" je sedaj na poziciji 0. To pozicijo si moraš zapomniti, ker se boš nanjo vračal. Zato že takoj na začetku klilčeš mark(). Tvoja verzija je pravilna, toda spregledal si en majhen detajl. Argument metode mark() ni pozicija, temveč število bytov, ki jih je potrebno prebrati, da postane oznaka neveljavna. Ker ti hočeš, da je veljavna celoten fajl, moraš dati kot argument v bistvu kar velikost fajla. Ker s tvojim algoritmom tega ne veš, poskusi kar z neko velikostjo (npr. 100 KB). Ne vem če ti bo delalo. Drugače pa obstaja tudi razred File, ki ti ponuja več informacij o določeni datoteki.

Malo popravljena verzija:


//recimo, da bo najvecji fajl velik 100k
private static int MAX_FILE_SIZE = 100000;

FileReader in1 = new FileReader("datoteka1.txt");
BufferedReader br1 = new BufferedReader (in1);
FileReader in2 = new FileReader("datoteka2.txt");
BufferedReader br2 = new BufferedReader (in2);
String s1;
String s2;
br1.mark(MAX_FILE_SIZE);
while ((s2= br2.readLine()) != null) {
k.println(s2);

while ((s1=br1.readLine()) != null){
k.println(s1+"\n");
}
br1.reset();
}


Ampak, če hočeš pravilno delovanje (ne vem če bi zgornja stvar delala, ker ne poznamo točne velikosti fajla), bo bolje, da uporabljaš tudi razred File. Še vedno se mi zdi, da boš imel najmanj problemov s Collectionom:


FileReader in1 = new FileReader("datoteka1.txt");
BufferedReader br1 = new BufferedReader (in1);
FileReader in2 = new FileReader("datoteka2.txt");
BufferedReader br2 = new BufferedReader (in2);
String s1;
String s2;
Collection file1 = new ArrayList();

while ((s1=br1.readLine()) != null){
file1.add(s1);
}

while ((s2= br2.readLine()) != null) {
k.println(s2);

for(Iterator it=file1.iterator();it.hasNext();) {
k.println(it.next());
}
}



Aja, ne pozabljaj uporabljati try { ... } catch { ... } finally { ... } blokov. Je ZELO pomembno, še posebej pri stvareh, kot je branje datotek.

T(he) Boss ::

Res velika hvala, za to nazorno razlago8-) . Zadevo pa sem resil samo s tem, ko sem ugotovil, kaj morem v argumente metode mark napisat. Ker je datoteka mala, sem napisal 2k, pa zadeva lepo dela. Try catch bloke pa seveda imam, samo tega pac nisem gor lepil, ker ni pomembno.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java]: replace - slovar v txt

Oddelek: Programiranje
121578 (1436) Spura
»

Branje datoteke [C]

Oddelek: Programiranje
81024 (953) Glodko
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242264 (1899) Bela01
»

[JAVA] kako dobiti določene chare

Oddelek: Programiranje
131530 (1377) molotov
»

branje iz fajla v javi

Oddelek: Programiranje
51068 (1008) Lizard

Več podobnih tem