Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: tiedostosta etsiminen

Moozax [28.11.2012 12:10:53]

#

Tässä on ircbottia tullut koodailtua ja lähenee valmistumistaan. Nyt on kuitenkin ilmennyt eräs ylitsepääsemätön ongelma eikä mikään ei tunnu tepsivän.
Tiedostosta pitäisi siis etsiä aina tietyltä 4 arvoa sisältävältä riviltä 3 tiettyä arvoa ja verrata niitä metodin saamiin arvoihin. Mikäli ne kaikki ne vastaavat toisiaan, täytyisi metodin palauttaa true. Ongelmana on se, että se osaa etsiä vain ensimmäisen arvon, mutta ei muita.

tummaBot.java

private boolean onkoOP(String sender, String channel, String hostname) {
    	BufferedReader syottotdsto = null;
    	String line = "";

	    try {
	    	syottotdsto = new BufferedReader(new FileReader(OPTIEDOSTO));

	    	line = syottotdsto.readLine();
	    	while((line = syottotdsto.readLine()) != null) {
	    		if (line.contains(sender) && line.contains(hostname) && line.contains(channel)) {
	    			syottotdsto.close();
	    			return true;
	    		}
	    		line = syottotdsto.readLine();
	    	}
	    	syottotdsto.close();
	    	return false;
	    } catch (IOException e) {
	    	System.out.println(e);
	    	return false;
	    }
	}

opit.txt

testinick|testisalasana|85-131-114-231.bb.dnainternet.fi|testikanava

Aluksi mietin, että voiko syy olla siinä kun nuo arvot ovat eroteltu toisistaan | -merkillä välilyönnin sijaan. Mutta eihän sillä tulisi olla merkitystä, kun tuon 'contains'in avulla etsii?
Tuntuisi kyllä niin yksinkertaiselta asialta toteuttaa, mutta ..

Macro [28.11.2012 15:20:09]

#

Ainakin sulla on kaksi ylimääräistä readLine-kutsua. Poista readLine() ennen while-silmukkaa ja sen viimeiseltä riviltä.

Kun kutsut readLineä, niin seuraava kutsu taitaapi hakea jo seuraavan rivin, jolloin loopistasi jää pari riviä pois.

Grez [28.11.2012 15:46:35]

#

Ehdottaisin jotain tyyliin

private boolean onkoOP(String sender, String channel, String hostname) {
        BufferedReader syottotdsto = null;
        String line = "";

        try {
            syottotdsto = new BufferedReader(new FileReader(OPTIEDOSTO));

            while((line = syottotdsto.readLine()) != null) {
                String[] parts = line.split('|');
                if (parts[0].equals(sender) && parts[2].equals(hostname) && parts[3].equals(channel)) {
                    syottotdsto.close();
                    return true;
                }
            }
            syottotdsto.close();
            return false;
        } catch (IOException e) {
            System.out.println(e);
            return false;
        }
    }

Tämä lähinnä sen takia, että tuolla contains lähestymistavallasi jos siellä on määritelty testinick, niin yhtähyvin kelpaa myös tunnukset testi, nick, ini, est, stin tms.

Moozax [28.11.2012 16:30:46]

#

Hyviä pointteja laitoitte. Eli siis readLine lukee rivin, vaikka se on laitettu tuonne while():n sisään? Aika jännä.
Grez, noin minulla alunperin se itseasiassa olikin, mutta sekään ei toiminut. Vaihoin sen tosin takaisin noin.
Tässä ei kyllä ole mitään järkeä, miksi tuo ei toimisi.. tämmöisen koodinpätkän jostain netin syövereistä löysin, jolla se osasi etsiä ainakin pelkän nickin:

private boolean onkoOP(String etsittava) {
	    String seuraavaNimi;
	    BufferedReader syottotdsto = null;
	    boolean loydetty = false;

	    try {
	    	syottotdsto = new BufferedReader(new FileReader("opit.txt"));
	    	seuraavaNimi = syottotdsto.readLine();
	    	while(seuraavaNimi != null && !loydetty) {
	    		if (seuraavaNimi.contains(etsittava))
	    			loydetty = true;
	    		seuraavaNimi = syottotdsto.readLine();
	    	}
	    } catch (IOException e) {
	        System.out.println(e);
	    }

	    if (loydetty) {
	    	try {
		    	if (syottotdsto != null)
		    		syottotdsto.close();
		    } catch(IOException e) {
		        System.out.println(e);
		    }

	    	return true;
	    } else {
	    	try {
		    	if (syottotdsto != null)
		    		syottotdsto.close();
		    } catch(IOException e) {
		        System.out.println(e);
		    }

	    	return false;
	    }
	}

Tämä botti ylläpitäisi kyllä aika pientä kanavaa, joten eipä sekään hirveästi varmaan haittaisi, jos tuo tarkastaisi pelkän nickin avulla oikean tyypin.

Grez [28.11.2012 17:05:51]

#

No jos se löytää pelkän nicin, mutta tuo mikä tarkistaa myös kanavan ja hostin ei toimi, niin ehkä sulla on kirjoitusvirhe kanavassa ja/tai nickissä.. Kannattaa myös huomata että vertailu on ainakin oletuksena case sensitive, eli testikanava ei ole TestiKanava.

Suosittelen debuggaamaan ohjelmaa rivi kerrallaan ja katsomaan mitä siellä itse asiassa tapahtuu. Eli esim. kun se on menossa tuolle riville jossa vertailut tapahtuu, voisit katsoa mitä muuttujat itse asiassa sisältää. Yleensä jossain vaiheessa tulee sellainen "douuu" ääni. :D

Moozax [28.11.2012 20:10:54]

#

Löysin sen "douuu"-äänen, josta puhuit, Grez...

split("|") täytyy muuttaa muotoon split("\\|"), koska pelkkä | erottaa kaikki kirjaimet toisistaan tyyliin T, e, s, t, i, n, i, m, i, jne.
Huhhuh.

Vastaus

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

Tietoa sivustosta