Gå til innhold

Lese fra fil, samtidig skrive til samme fil


Anbefalte innlegg

Jeg har skjønt at dette ikke går, men hvordan løser man det egentlig?

 

package exercisesCh06;

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

public class Exercise08 {

public static final int MAX = 60;

public static void main(String[] args) {
 try {
  Scanner fileIn = new Scanner(new File("lipsum2.txt"));
  PrintStream fileOut = new PrintStream("lipsum2.txt");
  wordWrap(fileIn, fileOut);
 } catch(FileNotFoundException exc) {

 }
}

public static void wordWrap(Scanner fileIn, PrintStream fileOut) {
 while (fileIn.hasNextLine()) {
  String line = fileIn.nextLine();
  while (line.length() > MAX) {
 String first = line.substring(0, MAX);
 fileOut.println(first);
 line = line.substring(MAX);
  }
  fileOut.println(line);
 }
 fileOut.close();
}

}

Lenke til kommentar
Videoannonse
Annonse

Nå sitter jeg ikke med kodeeksempler foran meg for dette, men det du må gjøre er å åpne en file-stream med både lese og skrive-aksess. Så må du først lese en linje og skrive en linje, bare pass på hvordan du velger å skrive og lese, ettersom hvis du skriver nye linjer på slutten så vil du til slutt også lese disse ;)

Lenke til kommentar

Legger ved oppgaveteksten til oppgave 7 også, siden den er relevant.

 

7. Write a method called wordWrap that accepts a Scanner representing an input file as its parameter and outputs each line of the file to the console, word-wrapping all lines that are longer than 60 characters. For example, if a line contains 112 characters, the method should replace it with two lines: one containing the first 60 characters and another containing the final 52 characters. A line containing 217 characters should be wrapped into four lines: three of length 60 and a final line of length 37.

 

8. Modify the preceding wordWrap method so that it outputs the newly wrapped text back into the original file. (Be careful—don’t output into a file while you are reading it!) Also, modify it to use a class constant for the maximum line length rather than hard-coding 60.

Endret av banansplitt™
Lenke til kommentar

Høres ut som en ufattelig tåpelig oppgave, og hva målet med den er aner jeg ikke.

 

Du kan lage to tråder om du vil, men jeg leser teksten slik at du helt fint kan holde denne teksten i f.eks en liste. Det er enklest å beskrive en array, selv om jeg ikke anbefaler dette.

 

[0] -> "Det var en gang"

[1] -> "en skoleoppgave".

[2] -> "nrk.no er en fin nettside"

[3] -> "Det er snart sommer"

 

Du ser sikkert hvor jeg vil med dette. Du bruker rett og slett listen til å definere linjer i tekstfilen du ønsker å skrive. Nå kan du bruke f.eks. en foreach og skrive en linje til filen hvor hver iterasjon.

 

Det finnes flere måter å løse denne på, men du kan jo la dette kverne litt i alle fall.

Lenke til kommentar

Jeg skjønner ideen men greier ikke gjennomføre den. Det er vel sånn at jeg må deklarere hvor mange plasser det skal være i den arrayen før jeg begynner å scanne filen, men for å kunne finne ut hvor mange plasser jeg trenger så må jeg først scanne filen og dermed "bruker opp" next...() ?

 

Eller er jeg helt på jordet nå?

Lenke til kommentar

Jeg skjønner ideen men greier ikke gjennomføre den. Det er vel sånn at jeg må deklarere hvor mange plasser det skal være i den arrayen før jeg begynner å scanne filen, men for å kunne finne ut hvor mange plasser jeg trenger så må jeg først scanne filen og dermed "bruker opp" next...() ?

 

Eller er jeg helt på jordet nå?

Jeg mente for all del ikke at du skulle bruke en String[] array, det er ikke hensiktsmessig når du jobber med ukjente størrelser slik som nå.

 

psudokode:

 

while(!nextLine.isEmpty()) {

myArrayList.add(string);

}

 

Jeg ønsker ikke skrive hele koden for deg, da en skikkelig "aha!" opplevelse ofte sitter lengre enn å skrive av et svar.

 

Forøvrig, jeg må gjenta det, det finnes flere måter å løse dette på, og bare ved å nevne det på kontoret hadde vi allerede 3 forskjellige løsninger innen få sekunder. Så det er bare å bruke fantasien og alt du har lært til nå :) Programmering skal jo være gøy!

Lenke til kommentar

Noen ganger tenker jeg for avansert. Det var jo bare å bruke en variabel, herrejesus. Klarte ikke helt å løse det med å bruke selve Prinstreamen som parameter, måtte heller bruke filnavn, men det er vel "lov"?

 

package exercisesCh06;
import java.io.*;
import java.util.*;
public class Exercise08 {

public static final int MAX = 60;

public static void main(String[] args) {
 try {
  Scanner fileIn = new Scanner(new File("lipsum2.txt"));
  wordWrap(fileIn, "lipsum2.txt");
 } catch(FileNotFoundException exc) {}
}

public static void wordWrap(Scanner fileIn, String fileOutName) {
 String article = "";
 while (fileIn.hasNextLine()) {
  String line = fileIn.nextLine();
  while (line.length() > MAX) {
String first = line.substring(0, MAX);
article = article + "\r\n" + first;
line = line.substring(MAX);
  }
  article = article + "\r\n" + line;
 }
 fileIn.close();

 try {
  PrintStream fileOut = new PrintStream(fileOutName);
  fileOut.print(article);
  fileOut.close();
 } catch(FileNotFoundException exc) {}
}

}

Lenke til kommentar

Dette vil fungere, men det er ekstremt lite effektivt! For hver gang du setter "article" til en ny verdi vil et nytt String-objekt opprettes, og hele innholdet av article kopieres til det nye objektet... hastigheten og minneforbruket vil være veldig avhengig av filstørrelsen.

 

En mer effektiv måte å løse det på er å opprette en temporær fil, skrive til den for hver linje du leser inn, og til slutt erstatte den opprinnelige fila med den temporære.

Lenke til kommentar

Ok, prøvde å gjøre det slik du sa men har surra meg fært inn her. Så fort ting ble kjørt inn i try {} så fungerer ikke fileIn.hasNextLine() ?

 

package exercisesCh06;

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

public class Exercise08 {

public static final String FILE = "lipsum2.txt";
public static final int MAX = 60;

public static void main(String[] args) {
 try {
  Scanner fileIn = new Scanner(new File(FILE));
  PrintStream fileOut = new PrintStream(new File(FILE));
  wordWrap(fileIn, fileOut);
 } catch(FileNotFoundException exc) {}
}

public static void wordWrap(Scanner fileIn, PrintStream fileOut) {
 try {
  // Create temporary text file
  PrintStream fileTemp = new PrintStream(new File("temp.txt"));

  // Read file, wrap text, output to temp file
  while(fileIn.hasNextLine()) {	// <--- Fungerer ikke lenger
String line = fileIn.nextLine();
while(line.length() > MAX) {
 String first = line.substring(0, MAX);
 fileTemp.println(first);
 line = line.substring(MAX);
}
fileTemp.println(line);
  }
  fileIn.close();
  fileTemp.close();

  // Read temp file, output back into original file
  fileIn = new Scanner(new File(FILE));
  while(fileIn.hasNextLine()) {
fileOut.println(fileIn.nextLine());
  }
 } catch(FileNotFoundException exc) {}
}

}

Lenke til kommentar

Sjekk filnavnene dine forskjellige steder i koden. Tror du må være forsiktig med å opprette en PrintStream for den samme fila som du leser fra før du har lest den fila ferdig. Dessuten skal du vel lese fra den temporære fila i den siste delen av wordWrap-metoden...

 

Her er et forslag på hvordan det kan gjøres:

 

import java.io.*;
import java.util.*;
public class Exercise08 {
 public static final String FILE = "lipsum2.txt";
 public static final int    MAX = 60;
 public static void main(String[] args) {
   wordWrap(new File(FILE));
 }
 public static void wordWrap(File file) {
   try {
  Scanner fileIn = new Scanner(file);
  File tempFile = new File(file.getPath() + ".tmp");
  PrintStream fileOut = new PrintStream(tempFile);
  // read file, wrap text, output to temp file
  while (fileIn.hasNextLine()) {
    String line = fileIn.nextLine();
    int pos = 0;
    while ((line.length() - pos) > MAX) {
	  fileOut.println(line.substring(pos, pos+MAX));
	  pos += MAX;
    }
    fileOut.println(line.substring(pos));
  }
  fileIn.close();
  fileOut.close();
  // replace original file with temporary file
  file.delete();
  tempFile.renameTo(file);
   }
   catch (FileNotFoundException e) {
  e.printStackTrace();
   }
 }
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...