Dateieinlese in C++

hudao

Grünschnabel
Servus,

bin relativer C++ Neuling udn habe hier folgendes Problem bei der Dateieinlese: Ich habe ein Matrix an Zahlenwerten vorliegen, die ich gerne einlesen möchte. Die Zahlen sind unterschiedlich lang und durch Tabs getrennt. (Siehe Bild). Leider schaffe ich es nicht, mir eine Einlese zu schreiben, die mir einen Zahlenwert als Funktion von Zeile und Spalte übergibt. Könnten Ihr mir helfen?

Danke!
 

Anhänge

  • data1.PNG
    data1.PNG
    20 KB · Aufrufe: 24
Hi
Ich kann dir leider keinen Code posten da ich eher von der Javaseite komme aber ein wenig Pseudocode wird dir sicher helfen.

Als erstes würde ich den Text zeilenweise einlesen bis zur Zeile die der Funktion übergeben wird und diesen String dann per Tokenizer mit dem Teiler " " zerteilen. Hier kannst du dann die einzelnen Spalten rauslesen und einfach die übergebene Spalte zurückgeben.

Lg hendl
 
Update: Ich habs jetzt soweit das die Daten in einem buffer vom Typ char (was auch sonst) liegen. Bei meinem eigentlichen Problem bin ich aber leider nicht weiter.
 
Hi und Willkommen bei tutorials.de,

es geht sprachenmäßig also Richtung C?
Ist die Anzahl der Spalten pro Zeile fix?
Dann kann man zB. sscanf (zwei s, kein Schreibfehler) nehmen.

PS: Dein Buffer ist sicher kein einzelner char, sondern ein char-Array.
 
Ich fände es hier einfacher, die Daten zu streamen.
Sprich wie ein Lexer zu arbeiten, Pseudocode:
Code:
function readLine(line) {
  Array values;
  foreach (character ch in line) {
    if (is_digit(ch))  {
      values.push( readUntilWhiteSpace(ch) );
    }
    else if (is_whitespace(ch)) {
      skipWhitespace();
    }
    else {
      values.push( readNaNValue(ch) );
    }
  }
}
So ungefähr. Natürlich mit Fehlerbehandlung, etc.
Du könntest natürlich auch für jede Zeile die ganze Zeile einlesen, sie anhand der Kommata aufspalten und jedes resultierende Element noch wegen der Leerzeichen trimmen.
 
Hallo Hudao,
du möchtest eine Funktion haben die dir die Zahl an (Zeile | Spalte) ausgibt? Das könnte in etwa so aussehen (grob, ohne Fehlerbehandlung):
C++:
//headerkram
#include <fstream>
#include <limits>

//zeugs...

//hilfsfunktion definieren
std::fstream& SpringeZuZeile(std::fstream& Datei, unsigned int Zeile){
    Datei.seekg(std::ios::beg);
    for(auto i=0; i < Zeile - 1; ++i){
        Datei.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    return Datei;
}
auto Zahlwert(int Zeile, int Spalte) -> float //C++11-konform ;-)
{
    std::fstream FS;
    float Puffer; //lege Puffer an
    FS.open("dateiname.txt", std::ios::in); //öffne Dateistrom
    SpringeZuZeile(FS, Zeile); //springe in die angegebene Zeile
    for(auto i=0; i < Spalte; ++i){
        FS >> Puffer; //schreibe Zahl in Puffer (ist nicht elegant, aber auch nicht langsam)
    }
    FS.close(); //schließe Dateistrom
    return Puffer; //gib Puffer zurück
}

Wie du siehst, verwende ich float statt char, da in deiner Matrix Kommazahlen stehen. Kannst du natürlich korregieren falls du runden willst.

Falls du wirklich nur alle paar Sekunden/Minuten mal eine Zahl auslesen willst, ist das eine gute Routine, aber falls du oft hintereinander auf diese Zahlen zugreifen willst, schlage ich dir vor ein float-Array zu verwenden und alle Daten zu puffern (so groß ist die Matrix ja nicht).
Also ich meine damit: float Zahlwert[AnzahlZeilen][AnzahlSpalten];
Das dann komplett einlesen und damit arbeiten (geht gefühlte 10.000 Mal schneller).

Gruß Technipion

PS: Falls das mit Tabulatoren nicht funktioniert öffne die Datei mit einem Textbearbeitungsprogramm und ersetze die Tabs mit Leerzeichen.
 
Zurück