banansplitt™ Skrevet 28. april 2013 Del Skrevet 28. april 2013 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
Kamikaze-Kanin Skrevet 28. april 2013 Del Skrevet 28. april 2013 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
stelar7 Skrevet 28. april 2013 Del Skrevet 28. april 2013 (endret) -SNIP- Endret 28. april 2013 av stelar7 Lenke til kommentar
scav- Skrevet 6. mai 2013 Del Skrevet 6. mai 2013 Hva er det du egentlig ønsker å oppnå med dette? For min del høres det mer ut som om du behøver en form for mellomlagring, gjerne en cache? Lenke til kommentar
banansplitt™ Skrevet 6. mai 2013 Forfatter Del Skrevet 6. mai 2013 Det er en skoleoppgave. Cache har jeg ikke lært om enda. Lenke til kommentar
scav- Skrevet 6. mai 2013 Del Skrevet 6. mai 2013 Om du skal ha hjelp til en skoleoppgave er det enklere om du deler oppgaveteksten. Da kan du få hjelp deg med løsninger av problemet også Lenke til kommentar
banansplitt™ Skrevet 6. mai 2013 Forfatter Del Skrevet 6. mai 2013 (endret) 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 6. mai 2013 av banansplitt™ Lenke til kommentar
scav- Skrevet 7. mai 2013 Del Skrevet 7. mai 2013 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
banansplitt™ Skrevet 7. mai 2013 Forfatter Del Skrevet 7. mai 2013 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
stelar7 Skrevet 7. mai 2013 Del Skrevet 7. mai 2013 (endret) Ikke helt sikker på hva du har lært enda, men kan du ikke bruke LinkedList eller ArrayList? Evnt. StringBuffer eller StringBuilder? Endret 7. mai 2013 av stelar7 Lenke til kommentar
scav- Skrevet 7. mai 2013 Del Skrevet 7. mai 2013 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
banansplitt™ Skrevet 7. mai 2013 Forfatter Del Skrevet 7. mai 2013 (endret) ArrayList er ikke lært enda, derfor blir det feil å bruke det i denne oppgaven. Får prøve meg litt til. Endret 7. mai 2013 av banansplitt™ Lenke til kommentar
stelar7 Skrevet 7. mai 2013 Del Skrevet 7. mai 2013 Tror han sikter til størrelsen på arrayet... Lenke til kommentar
banansplitt™ Skrevet 7. mai 2013 Forfatter Del Skrevet 7. mai 2013 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
jonny Skrevet 7. mai 2013 Del Skrevet 7. mai 2013 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
banansplitt™ Skrevet 7. mai 2013 Forfatter Del Skrevet 7. mai 2013 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
jonny Skrevet 8. mai 2013 Del Skrevet 8. mai 2013 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå