Avatar billede fishbone Nybegynder
03. oktober 2001 - 18:35 Der er 14 kommentarer og
1 løsning

Læse linier fra en fil

Mjello\'

Jeg har brug for at læse fra en fil. Jeg har lavet noget lignende følgende, der skal kontrollere, om en linie starter med \'#\' eller ej, men det virker ikke. Kun første linie bliver læst - bagefter kører programmet bare videre.
BufferedReader reader = new BufferedReader(new FileReader(\"fil.txt\"));
while((linie = reader.readLine()) != null)
{
//alt muligt halløj, der tjekker om den læste linie starter med \'#\'
}
reader.close();

Af en eller anden grund, vil den kun læse den aller første linie.
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 18:38 #1
har du tjekket om den linie der læses ikke indeholder hele filen, så det ikke er formateringen i text-filen det er galt med
Avatar billede fishbone Nybegynder
03. oktober 2001 - 18:39 #2
Linien indeholder kun første linie fra filen - det er tjekket.
Avatar billede fishbone Nybegynder
03. oktober 2001 - 18:43 #3
Hov... ved at udkommentere koden, der tjekker linien viser det sig, at alle linier bliver læst. Problemet ligger altså her et sted.
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 18:52 #4
det her virker i hvert fald

import java.io.*;
public class ReadFromFile{
   
   
    public static void main(String[] args){
        try{
            BufferedReader reader = new BufferedReader(new FileReader(\"fil.txt\"));
            String linie;
            while((linie = reader.readLine()) != null){
                System.out.println(linie);
            }
            reader.close();
        }catch(Exception e) {
       
        }   
   
    }   
}
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 18:55 #5
hov havde ikke lige set din kommentar, har du fundet fejlen ellers post koden
Avatar billede fishbone Nybegynder
03. oktober 2001 - 19:30 #6
Koden ser således ud:

//Linien ignoreres, hvis den starter med # (= en kommenteret linie)
if (!line.startsWith(\"#\") || !line.equals(\"\"))
{
//temp = det ord, der står til venstre for lighedstegnet
String temp = line.substring(0, line.indexOf(\"=\")).trim();

//Sammenligner med det fundne ord og
//indsætter den tilsvarende værdi i vectoren
if(temp.equalsIgnoreCase(\"target_filename\"))
{
String value = temp.substring(temp.indexOf(\"=\")).trim();
liste.insertElementAt(value, 0);
}

else if(temp.equalsIgnoreCase(\"source_dir\"))
{
String value = temp.substring(temp.indexOf(\"=\")).trim();
liste.insertElementAt(value, 1);
}
                   
else if (temp.equalsIgnoreCase(\"destination_dir\"))
{
String value = temp.substring(temp.indexOf(\"=\")).trim();
liste.insertElementAt(value, 2);
}
}//end if
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 19:40 #7
Hvis den starter med # så er nedenstående false
!line.startsWith(\"#\")
og dermed vil nedenstående være true
!line.equals(\"\"))
og hele betingelsen vil derfor være true og dermed ignoreres en kommenteret linie ikke.

Eller er jeg helt galt på den
Avatar billede fishbone Nybegynder
03. oktober 2001 - 19:45 #8
Det er rigtigt... fjolle mig.
Et andet problem er nu, at readeren stopper, hvis der er en tom linie midt i filen - hvordan undgår man det?
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 19:58 #9
I eksemplet jeg postede ovenfor er der ikke noget problem med tomme linier
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 19:59 #10
kan du ikke prøve at poste hele kildekoden, altså while-løkken med indhold
Avatar billede fishbone Nybegynder
03. oktober 2001 - 20:03 #11
while ((line = reader.readLine()) != null)
{
    //Linien ignoreres, hvis den starter med # (= en kommenteret linie)
    if (!line.startsWith(\"#\") || line == null)
    {
        //temp = det ord, der står til venstre for lighedstegnet
        String temp = line.substring(0, line.indexOf(\"=\")).trim();
        //Sammenligner med det fundne ord og
        //indsætter den tilsvarende værdi i vectoren
        if(temp.equalsIgnoreCase(\"target_filename\"))
        {
            String value = temp.substring(temp.indexOf(\"=\")).trim();
            liste.insertElementAt(value, 0);
        }
           
        else if(temp.equalsIgnoreCase(\"source_dir\"))
        {
            String value = temp.substring(temp.indexOf(\"=\")).trim();
            liste.insertElementAt(value, 1);
        }
               
        else if (temp.equalsIgnoreCase(\"destination_dir\"))
        {
            String value = temp.substring(temp.indexOf(\"=\")).trim();
            liste.insertElementAt(value, 2);
        }
    }//end if
}//end while
reader.close();
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 21:11 #12

import java.io.*;
import java.util.*;
public class ReadFromFile{
   
   
    public static void main(String[] args){
        try{
            BufferedReader reader = new BufferedReader(new FileReader(\"fil.txt\"));
            String line;
            Vector liste = new Vector();
            while ((line = reader.readLine()) != null) {
               
                //Linien ignoreres, hvis den starter med # (= en kommenteret linie)
                if (!line.startsWith(\"#\") && !line.equals(\"\")) {
                   
                    //temp = det ord, der står til venstre for lighedstegnet
                    String temp = line.substring(0, line.indexOf(\"=\")).trim();
                   
                    //Sammenligner med det fundne ord og
                    //indsætter den tilsvarende værdi i vectoren                   
                    if(temp.equalsIgnoreCase(\"target_filename\")) {
                        String value = line.substring(line.indexOf(\"=\")+1).trim();
                       
                        liste.addElement(value);
                    } else if(temp.equalsIgnoreCase(\"source_dir\")) {
                        String value = line.substring(line.indexOf(\"=\")+1).trim();
                       
                        liste.addElement(value);
                    } else if (temp.equalsIgnoreCase(\"destination_dir\")) {
                        String value = line.substring(line.indexOf(\"=\")+1).trim();
                       
                        liste.addElement(value);
                    }
                }//end if
            }//end while
           
            for(int i=0;i<liste.size();i++){
                System.out.println(liste.elementAt(i));   
            }

            reader.close();
        }catch(Exception e) {
            e.printStackTrace();
        }   
   
    }   
}
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 21:17 #13
Eksemplet ovenfor ser ud til at virke
1. problem:
String value = temp.substring(temp.indexOf(\"=\")).trim();
smider en exception, da \"=\" ikke optræder i temp.
2.problem (måske): insertElementAt kræver at du har defineret størrelsen på din vector, hvilket du måske har.

3. problem line vil aldrig være null i din if-sætning det er udelukket pga. while betingelsen, antog at det var en tom streng den skulle ignorere

Efter som det er den samme værdi du smider ind i alle if-sætningerne skulle du måske overveje kun at have en if sætning som siger noget i stil med:
if(temp.equalsIgnoreCase(...) || temp.equals.... || temp.e...){

String value = line.substring(line.indexOf(\"=\")+1).trim();
                       
liste.addElement(value);
                   
}

eller hold evt. styr på en tæller samtidig hvis de enkelte værdier skal sidde bestemte steder.

Begrænsningen af selektioner vil gøre koden mere overskuelig og lettere at finde fejl i

håber du kan bruge noget af det

           
Avatar billede fishbone Nybegynder
03. oktober 2001 - 21:36 #14
Efter at have kigget på sagerne står det hele lysende klart, og skidtet fungerer. Mange mange tak for hjælpen - smid lige et svar, så du kan få dine velfortjente point.
Avatar billede mipe1 Nybegynder
03. oktober 2001 - 21:40 #15
takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester