Erste Schritte float-Array auslesen

Mathias1000

Mitglied
Wie kann ich float-Daten aus eine Datei auslesen ?

Bei der obigen Methode, bei der ich meine Daten als Text-Datei auslesen, geht es ohne Probleme.

Will ich aber direkt eine Binär-Datei mit Float-Werten auslesen, dann kommt nichts (2. Methode).

Pascal-single sollte gleich sein mit Java-float.

Java:
	private float[] ReadVector(String Datei) {

		int i = 0;
		float[] vec = null;
		try {
			BufferedReader f = new BufferedReader(new InputStreamReader(OpenGLES20Activity.MeinContext.getAssets().open(Datei)));
			String s = f.readLine();
			anzVertex = Integer.parseInt(s);
			vec = new float[anzVertex];
			// while ((s = f.readLine()) != null) {
			for (i = 0; i <= anzVertex - 1; i++) {
				s = f.readLine();
				float fl = Float.parseFloat(s);
				vec[i] = fl;
				// i++;
			}
			f.close();
		} catch (IOException e) {
			Log.e(null, "Fehler beim Lesen der Datei", e);
		}
		return vec;
	}

	private float[] ReadVectorBin(String Datei) {

		int i = 0;
		float[] vec = null;
		try {
			BufferedReader f = new BufferedReader(new InputStreamReader(OpenGLES20Activity.MeinContext.getAssets().open(Datei)));
			float fl = f.read();
			anzVertex = Math.round(fl);
			anzVertex = 18;
			vec = new float[anzVertex];

			for (i = 0; i <= anzVertex - 1; i++) {
				fl = f.read();
				vec[i] = fl;
				i++;
			}
			f.close();
		} catch (IOException e) {
			Log.e(null, "Fehler beim Lesen der Datei", e);
		}
		return vec;
	}
Mit dieser Pascal(Lazarus)-Procedure werden die Binär-Daten geschrieben:
Java:
procedure WriteBin(Datei: string);
var
  i, j, k: integer;
  f: file of single;
  s: single;
begin
  AssignFile(f, Datei);
  ReWrite(f);
  s := Length(Vector) * 3 * 3;
  for i := 0 to Length(Vector) - 1 do begin
    for j := 0 to 2 do begin
      for k := 0 to 2 do begin
        Write(f, Vector[i, j, k]);  // Vector ist eine singleArray
      end;
    end;
  end;
  CloseFile(f);
end;
 
Zuletzt bearbeitet:
les doch erst mal die datei in eine Arraylist oder so was ein und übergibt diese an eine Methode die dann den den inhalt der arraylist in dein float[] umwandelt
 
les doch erst mal die datei in eine Arraylist oder so was ein und übergibt diese an eine Methode die dann den den inhalt der arraylist in dein float[] umwandelt

Ja oder man fängt erst mal damit an den BufferedReader, der für Text geeignet ist (steht auch in der Dokumentation), gegen etwas zu ersetzen mit dem man reine Binärfiles einlesen kann...
 
Ich habe da noch was anderes versucht, ausser eine Schutzverletzung kommt nichts. 🙁

Warscheinlich liegt es wieder mal am Context.

Java:
	private float[] ReadVectorBin2(String Datei) {

		float[] vec = null;
		FileInputStream fis = null;

		try {
			File file = new File(Datei);
			fis = new FileInputStream(file);
			long size = file.length();
			anzVertex=(int) size;
			anzVertex=18;  // Testweise nur 18 floats, die kleinste Datei hat nur 18.
			int by, i = 0;			
			vec = new float[anzVertex];
			for (i = 0; i <= anzVertex - 1; i++) {
				by = fis.read();
				vec[i] = by;
				i++;
			}
		}

		catch (IOException ex) {
			System.out.println(ex);
		} finally {
			if (fis != null)
				try {
					fis.close();
				} catch (Exception ex) {
				}
		}
		return vec;
	}
 
Was mache ich falsch, jetzt werden Float-Werte eingelsen, aber der Wert des Float stimmt nicht.

Ich habe dies als Muster benutzt: android - Read float values from file using readFloat() - Stack Overflow
Leider muss ich InputStream anstelle FileInputStream nehmen, sonst funtionier die Zeile mit mContext.getAssets().open(Datei); nicht.

Das ganze soll auf Android laufen.

Java:
private float[] ReadVectorBin(String Datei) {
		Environment.getDataDirectory();
		float[] vec = null;
		float fl = 0.0f;
		InputStream is = null;
		DataInputStream dis = null;		
		try {
			is = mContext.getAssets().open(Datei);
			dis = new DataInputStream(is);
			fl = dis.readFloat();  // Hier kommt der erste fehlerhafte Wert.
			anzVertex = Math.round(fl);

			System.out.println("---------------");
			System.out.print(Datei + " - float:");
			System.out.println(fl + " - int:" + anzVertex);
			System.out.println("---------------");

			// anzVertex = Integer.pa
			anzVertex = 18;
			int i = 0;
			vec = new float[anzVertex];
			for (i = 0; i <= anzVertex - 1; i++) {
				fl = dis.readFloat();
				System.out.println(fl);
				vec[i] = fl;
				i++;
			}
			dis.close();
		}
		catch(FileNotFoundException fe)
		{
		  Log.d("ERROR", "FileNotFoundException : " + fe);
		}
		catch(IOException ioe)
		{
		  Log.d("ERROR","IOException : " + ioe);
		}
		return vec;
	}
 
Zuletzt bearbeitet:

Zurück
Oben