Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
leider bin ich seit einiger zeit schon nicht mehr mit java am programmieren, wollte es jetzt jedoch wieder beginnen und steh schon vor dem ersten problem.
ich möchte gerne zahlen aus der datei "c:\zahlen.dat" in ein array einlesen. es handelt sich testweise um 5 zahlen, benoetige also kein vektor, sondern lediglich ein einfaches array.
public class ZahlenEinlesen {
public static void main(String[] args)
{
Also Text mit Komma getrennt. Nur eine Zeile. Fakultative Leerzeichen. So in der Art?
Dann mach ungefähr sowas:
Code:
Reader reader = null;
try {
reader = new BufferedReader(new FileReader("file.dat"));
int c;
final StringBuffer buffer = new StringBuffer();
while ((c = reader.read()) > -1) {
switch (c) {
case ' ':
case '\t':
case '\r':
case '\n':
break;
default:
buffer.append((char) c);
}
}
// now we have the whole text w/o white spaces in buffer
final String[] tokens = buffer.toString().split(",");
final double[] values = new double[tokens.length];
for (int i = 0; i < tokens.length; i++) {
values[i] = Double.parseDouble(tokens[i]);
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {
// ignore
}
}
}
doch so kompliziert? also die trennzeichen der datei ist egal, sollte nur n test sein, waere es zeilengetrennt einfacher?
ich dachte mir das so, weiss nur nicht, ob es in java möglich ist, ich verknuepfe die datei und lese eine zeile aus, dann wandle ich sie in ein double und fuelle sie in ein array-feld.
:idea: Zeilenweise... hatte ich glatt überlesen. Das macht's deutlich einfacher.
Du meinst das grob so, oder (Exceptions musst Du selber noch fangen):
Code:
final double[] array = new double[5];
final BufferedReader r = new BufferedReader(new FileReader("foo"));
String line;
for(int i = 0; i < array.length && (line = r.readLine()) != null; i++) {
array[i] = Double.parseDouble(line);
}
r.close();
vielen dank schonmal für deine schnellen Antworten. hab jetzt mal einen test laufen lassen und hab eine fehlerausgabe, welche mir nicht viel sagt. hat dazu jmd eine idee?
Code:
public class ZahlenEinlesen {
public static void main(String[] args){
double minimum=0;
double maximum=0;
double summe=0;
final double[] array = new double[5];
final BufferedReader r = new BufferedReader(new FileReader("zahlen.dat"));
String line;
for(int i = 0; i < array.length && (line = r.readLine()) != null; i++) {
array[i] = Double.parseDouble(line);
}
r.close();
for(int i=0; i<100; i++)
{
if (minimum > array[i])
{
minimum=array[i];
}
if (maximum < array[i])
{
maximum=array[i];
}
summe=summe+array[i];
}
System.out.println( "Das Minimum ist: "+ minimum);
System.out.println( "Das Maximum ist: "+ maximum);
System.out.println( "Der Durchschnitt ist: "+ (summe/100));
}
}
eclipse sagt:
BufferedReader cannot be resolved to a type
BufferedReader cannot be resolved to a type
FileReader cannot be resolved to a type
at ZahlenEinlesen.main(ZahlenEinlesen.java:14)
desweiteren frag ich mich, wie ich den pfad zu der datei eingeben kann.
MfG
Peterchen
In meinem Code-Beispiel oben, in Zeile drei steht:
Code:
final BufferedReader r = new BufferedReader(new FileReader("foo"));
"foo" ist dabei der Dateiname (kann also auch "/home/ebenius/foo.txt", oder "C:\Documents and Settings\ebenius\My Documents\foo.txt" sein). Wo Du den Dateinamen herbekommst? Entweder ist er immer gleich, oder Du übergibst ihn beim Programmaufrauf (dann wird er in der main()-Methode mitgegeben), oder Du liest Ihn aus nem .properties-File, oder Du fragst ihn in ner GUI ab (JFileChooser), oder Du fragst ihn in stdin ab (System.in), oder ...
irgendwie ist da echt der wurm drin. immer noch ein fehler in der folgenen zeile. hab schon ' und " getestet mit " gibts nur fehler mit ' bekomme ich den unten angeführten.
Code:
final BufferedReader r = new BufferedReader(new FileReader('G:\zahlen.dat'));
Fehlerausgabe mit ':
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Invalid character constant
Fehlerausgabe mit ":
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
:-/ Musst natürlich noch die Exceptions abfangen. try und catch sollte man kennen. Wenn Du's nicht kennst, dann such Dir mal ein Java-Buch oder einen Online-Kurs.
Für den Anfang hilft allerdings in Zeile drei (aus Deinem Beispiel oben) das da zu schreiben:
Code:
public static void main(String[] args) throws Exception {
ich geh ein, wieso hab ich da 100 reingeschrieben? vllt war ich ja noch in der binaerschreibweise, da ein array ja bei 0 beginnt endet es bei 4.
denke nur nicht, dass ich mich damit rausreden kann, oder?
Ich stehe vor einem ähnlichen Problem. Bei mir enthält eine Text Datei in jeder Zeile 2 Worte die durch ein | getrennt sind. Genauer gesagt ist alles was auf einer Seite des | steht ein zusammenhängendes Wort.
Also "Hallo da draussen|Hallo zurueck" --> 1.Wort : "Hallo da draussen" 2.Wort : "Hallo zurueck".
Ich möchte diese beiden Worte jetzt in jeweils eine ArrayList einlesen, eine für die Worte links vom | und eine für die rechts vom | .
Leider habe ich an einigen Stelle noch Verständnisschwierigkeiten was den untenstehenden Code angeht...
Ebenius hat gesagt.:
Dann mach ungefähr sowas:
Code:
Reader reader = null;
try {
reader = new BufferedReader(new FileReader("file.dat"));
int c;
final StringBuffer buffer = new StringBuffer();
while ((c = reader.read()) > -1) { // ich habe bis jetzt immer != -1 benutzt
switch (c) { // c hat jetzt einen Wert zwischen 0 und 65535 oder ?
case ' ': // ab hier komm ich nicht mehr weiter
case '\t': // was bezweckt diese switch anweisung ?
case '\r':
case '\n':
break;
default:
buffer.append((char) c); // was bezweckt append ?
}
}
// now we have the whole text w/o white spaces in buffer
final String[] tokens = buffer.toString().split(","); // bei mir müsste split("|"); stehen oder ?
// warum muss der Array nicht ein zweites mal initialisiert werden ? ( tokens = new String[index] )
final double[] values = new double[tokens.length];
for (int i = 0; i < tokens.length; i++) {
values[i] = Double.parseDouble(tokens[i]);
}
} catch (FileNotFoundException ex) {
ex.printStackTrace(); //was macht printStackTrace ? Einen Pfad ausgeben ?
} catch (IOException ex) {
ex.printStackTrace();
} finally { // was heißt finally ?
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {
// ignore
}
}
}
Weil meine Antwort auf PeterchenPan bezogen war.
Bei deinem Code würde ich vorschlagen, statt mit BufferedReader.read mit BufferedReader.readLine gleich die ganze Zeile einzulesen, das ist wesentlich einfacher. Dann bei "|" splitten, wie du schon richtig erkannt hast. Dann values[0] in die eine und values[1] in die andere ArrayList adden.