Avatar billede muingaza Nybegynder
13. januar 2005 - 23:23 Der er 20 kommentarer

Problemer med at skrive til fil (I/O)

Jeg har en tekstfil (test.txt) som jeg læser fra. Indholdet fra denne fil ønsker jeg så at skrive til en ny fil (fx testout.txt). Dog må der på hver line max være ca. 10 chars.

Jeg har fået noget hjælp til at bruge StringTokenizer som jeg skal bruge i sammenhæng med læsning og skrivning til filen. Jeg har modificeret lidt på min klasse men kan kun skrive den første samling af tokens der har en length på ca. 10 til min fil.

Jeg kunne forstille mig at problemet opstår i min return statement, håber nogen har et hint eller 2.

-------------------------

import java.io.*;
import java.util.*;

public class PrettyPrint {
   
    private BufferedReader infile;
    private String name;

    public PrettyPrint(String file_name){
       
       
      try{ infile = new BufferedReader(new FileReader(file_name));}
        catch (Exception e)
        {System.out.println("No such file");
        throw new RuntimeException("No such file2");
        }
    }
   

   
    public String readWord()throws IOException{
        String temp = "";

        if (infile.ready())
        {String line = infile.readLine().trim();
        StringTokenizer k = new StringTokenizer(line);
       
        int i = 0;
       
        while(i<= k.countTokens())
        {
       
            while(temp.length()<= 10)
            {String first_line = k.nextToken();
            temp = temp + first_line + " ";
       

            }
           
            temp = "";
            i++;
            }
        }
        return temp;
     
    }
Avatar billede arne_v Ekspert
13. januar 2005 - 23:36 #1
Prøv:

import java.io.*;
import java.util.*;

public class PrettyPrint {
    public static String load(String filename) {
        StringBuffer sb = new StringBuffer("");
        try {
            BufferedReader in = new BufferedReader(new FileReader(filename));
            String line;
            while((line = in.readLine()) != null) {
                sb.append(line);
                sb.append(' ');
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    public static void main(String[] args) throws Exception {
        String a = load("C:\\test.txt");
        PrintWriter pw = new PrintWriter(new FileOutputStream("C:\\testout.txt"));
        StringTokenizer p = new StringTokenizer(a, " ");
        String temp = p.nextToken();
        while (p.hasMoreTokens()) {
            String word = p.nextToken();
            if(temp.length() + 1 + word.length() > 10) {
                pw.println(temp);
                temp = word;
            } else {
                temp = temp + " " + word;
            }
        }
        if(temp.length() > 0) {
            pw.println(temp);
        }
        pw.close();
    }
}
Avatar billede muingaza Nybegynder
13. januar 2005 - 23:45 #2
Du har ikke mulighed for at specificere hvad det er jeg gør galt? Jeg har en anden klasse med en main metode hvor jeg tjekker klassen PrintPretty
Avatar billede muingaza Nybegynder
13. januar 2005 - 23:46 #3
Ups...det var vist ikke meningen at jeg skulle svare på mit eget indlæg...
Avatar billede arne_v Ekspert
13. januar 2005 - 23:46 #4
Så længe du ikke accepterer dit eget svar så går det nok.
Avatar billede arne_v Ekspert
13. januar 2005 - 23:47 #5
Jeg kan sagtens omskrive det til en metode som kan kaldes fra din main.
Avatar billede arne_v Ekspert
13. januar 2005 - 23:50 #6
import java.io.*;
import java.util.*;

public class PrettyPrint {
    public static String load(String filename) {
        StringBuffer sb = new StringBuffer("");
        try {
            BufferedReader in = new BufferedReader(new FileReader(filename));
            String line;
            while((line = in.readLine()) != null) {
                sb.append(line);
                sb.append(' ');
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    public static void format(String infnm, String outfnm) throws IOException {
        String a = load(infnm);
        PrintWriter pw = new PrintWriter(new FileOutputStream(outfnm));
        StringTokenizer p = new StringTokenizer(a, " ");
        String temp = p.nextToken();
        while (p.hasMoreTokens()) {
            String word = p.nextToken();
            if(temp.length() + 1 + word.length() > 10) {
                pw.println(temp);
                temp = word;
            } else {
                temp = temp + " " + word;
            }
        }
        if(temp.length() > 0) {
            pw.println(temp);
        }
        pw.close();
    }
    public static void main(String[] args) throws Exception {
        PrettyPrint.format("C:\\test.txt", "C:\\testout.txt");
    }
}
Avatar billede muingaza Nybegynder
14. januar 2005 - 00:11 #7
Jeg mente mere hvad det er som går galt i mine while løkker. Jeg vil jo gerne have retuneret den "streng" indholdet i min tekstfil består af i små bidder der hver er ca. 10 chars. Det er det som min metode readWord skal gøre. Ved ikke om det er præcist nok formuleret?
Avatar billede kalp Novice
14. januar 2005 - 00:46 #8
se http://www.eksperten.dk/spm/580557

her har både jeg og arne svaret på hvordan man laver få den til at udskrive en String i flere bider:)
Avatar billede muingaza Nybegynder
14. januar 2005 - 00:52 #9
Hehe ja når jeg bruger jeres koder virker det fint, men kunne godt tænke mig at se om jeg også kunne få "repareret" denne version...har haft et stædigt udestående med den i et stykke tid. Kan godt lide at få så meget rutine med det som muligt.
Avatar billede kalp Novice
14. januar 2005 - 00:53 #10
import java.util.StringTokenizer;

public class Test
{
public String opDelTekst(String linje)
{
  int Tegn = 0;
      String ord ="", tmp ="";
      StringTokenizer tokenizer;
         
        tokenizer = new StringTokenizer (linje);

        while (tokenizer.hasMoreTokens())
        {
            tmp = tokenizer.nextToken();
              Tegn += tmp.length();
            if(Tegn > 10)
            {
              Tegn = 0;
              ord +="\n";
            }
           
            ord += tmp + " ";
           
         
        }
      return ord;
}

  public static void main (String[] args)
  {
    Test start = new Test();
    String voresTekst = "Hej jeg skal hermed opdeles i mindre dele så jeg fylder mindre send mig lige til metoden";
    voresTekst = start.opDelTekst(voresTekst);
    System.out.println(voresTekst);
  }
}
Avatar billede kalp Novice
14. januar 2005 - 00:54 #11
her har jeg smidt det ind i en metode for dig.. du skal faktisk bare lave dine ændringer her.. hent og gem


public static void main (String[] args)
  {
    Test start = new Test();
    String voresTekst = "Hej jeg skal hermed opdeles i mindre dele så jeg fylder mindre send mig lige til metoden";
    voresTekst = start.opDelTekst(voresTekst);
    System.out.println(voresTekst);
  }


dvs..

String voresTekst = "Hej jeg skal hermed opdeles i mindre dele så jeg fylder

skal være


String voresTekst = "denfilduhenter";
Avatar billede muingaza Nybegynder
14. januar 2005 - 01:07 #12
Ok det var også det du skrev under mit indlæg ang. StringTokenizer ikke?

Men jeg er interesseret i at høre om der nogen som kan forklare mig hvad problemet helt præcist er med den kode jeg har skrevet i starten af tråden er, og hvilke ting der skal gøres for at få den til at du hvis det overhovedet er muligt.
Avatar billede kalp Novice
14. januar 2005 - 01:15 #13
bare så jeg slipper for at slå det op.. hvad gør trim(); ?
Avatar billede kalp Novice
14. januar 2005 - 01:21 #14
prøv lige denne metode.. er søvning og dårlig til at sætte mig ind i koden lige nu hehe...


import java.io.*;
import java.util.*;

public class PrettyPrint {
   
    private BufferedReader infile;
    private String name;

    public PrettyPrint(String file_name){
       
       
      try{ infile = new BufferedReader(new FileReader(file_name));}
        catch (Exception e)
        {System.out.println("No such file");
        throw new RuntimeException("No such file2");
        }
    }

public String readWord() throws IOException
{
        String temp = "";
        String first_line ="";

        if (infile.ready())
        {String line = file.readLine().trim();
StringTokenizer k = new StringTokenizer(line);
       
        int i = 0;
       
        while(i<= k.countTokens())
        {
       
            while(first_line.length()<= 10)
            {

            first_line = k.nextToken();
            temp = temp + first_line + " ";

            }
            temp = temp + "\n";
           
            i++;
            }
        }
        return temp;
     
    }
Avatar billede muingaza Nybegynder
14. januar 2005 - 01:23 #15
Den fjerne indledende og efterfølgende mellemrum:

"  abcd  ".trim();

giver

"abcd"
Avatar billede kalp Novice
14. januar 2005 - 01:29 #16
en stor fejl i din kode er i hvertfald du du erklære "first_line" variablen hver gang løkken bliver kørt og derfor sletter du alt der stod i den fra før:)

while(temp.length()<= 10)
            {String first_line = k.nextToken();
            temp = temp + first_line + " ";

skulle nok mere have været


while(temp.length()<= 10)
            {first_line = k.nextToken();
            temp = temp + first_line + " ";



så skal du før løkkerne skrive

String first_line;

men som du kan se i hele det kode eksempel jeg gav dig der har jeg sat det helt anderledes op(uden at teste).
Avatar billede arne_v Ekspert
14. januar 2005 - 09:36 #17
Det er svært at lave en pæn løsning med BufferedReader og readLine hvor der læses
løbende fordi linier i input og linier i output ikke matcher. Det vil blive noget
komplekst kode. Derfor valgte jeg at læse hele input ind og så parse det.

Hvis du bruger Java 1.5 (også kaldet 5.0) så kan du erstatte BufferedReader og
StringTokenizer med en Scanner og få en meget simpel løsning.
Avatar billede arne_v Ekspert
14. januar 2005 - 20:55 #18
import java.io.*;
import java.util.*;

public class PrettyPrintJava15 {
    public static void format(String infnm, String outfnm) throws IOException {
        Scanner scn = new Scanner(new FileInputStream(infnm));
        PrintWriter pw = new PrintWriter(new FileOutputStream(outfnm));
        String temp = scn.next();
        while (scn.hasNext()) {
            String word = scn.next();
            if(temp.length() + 1 + word.length() > 10) {
                pw.println(temp);
                temp = word;
            } else {
                temp = temp + " " + word;
            }
        }
        if(temp.length() > 0) {
            pw.println(temp);
        }
        pw.close();
    }
    public static void main(String[] args) throws Exception {
        PrettyPrint.format("C:\\test.txt", "C:\\testout.txt");
    }
}
Avatar billede arne_v Ekspert
14. januar 2005 - 20:56 #19
Hov forkert. Den rigtige er:

import java.io.*;
import java.util.*;

public class PrettyPrintJava15 {
    public static void format(String infnm, String outfnm) throws IOException {
        Scanner scn = new Scanner(new FileInputStream(infnm));
        PrintWriter pw = new PrintWriter(new FileOutputStream(outfnm));
        String temp = scn.next();
        while (scn.hasNext()) {
            String word = scn.next();
            if(temp.length() + 1 + word.length() > 10) {
                pw.println(temp);
                temp = word;
            } else {
                temp = temp + " " + word;
            }
        }
        if(temp.length() > 0) {
            pw.println(temp);
        }
        pw.close();
    }
    public static void main(String[] args) throws Exception {
        PrettyPrintJava15.format("C:\\test.txt", "C:\\testout.txt");
    }
}
Avatar billede arne_v Ekspert
25. februar 2005 - 22:25 #20
OK ?
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