C++ Aus einem File line for line auslesen

nRaged

Cadet 2nd Year
Registriert
Aug. 2013
Beiträge
17
Hallo,
ich hoffe hier kann mir bitte wer helfen :)

Folgendes Problem: Ich möchte aus einem File line for line auslesen. So weit so gut und eigentlich auch nicht schwer.
Jetzt hab ich folgenden Code:

Code:
struct Distance {
  int distance;
  int time;

  Distance (istream& in) {
    in >> distance >> time;
  }
};

void readMatrix (char* filename) {
  ifstream file(filename);

  matrix = (Distance*)(malloc(n_visits * n_visits * sizeof(Distance)));

  for (int i = 0; i < n_visits * n_visits; i++) {
      cout << Distance(file).distance << endl;
      new(&matrix[i]) Distance(file);
  }
}

Das Problem ist nun, dass der mir nur jede zweite Zeile ausliest. Falls ich im Struct von Distance das ">> time" lösche, liest er auch Zeile für Zeile aus. So weit konnt ich den Fehler schon zurückverfolgen. Leider weiß ich nicht wie ich ihn nun beheben soll.

Daher wär ich für en kleinen Tipp echt dankbar!
lg
 
Wenn du pro Iteration auch zwei mal "Distance(file)" machst, werden pro Iteration auch zwei Zeilen gelesen ...
 
Wundert dich das? Du erstellst in deiner cout-Zeile jedes mal ein temporäres Objekt vom Typ Distance. Der Konstruktor dieses temporären Objekts spult deinen Input-stream jedes mal einen Eintrag weiter ... das überspringst du also quasi.

An deinem Code hätte ich noch 'ne Menge rumzumäkeln. Da ich aber jetzt gerade ein Steak auf dem Herd habe, komme ich da später drauf zurück. ;)
 
Ach verdammt, ist klar....danke für die Hilfe!
Jetzt hab ich den Fehler schon vor ner Stunde gefunden und dann sowas :rolleyes:

An deinem Code hätte ich noch 'ne Menge rumzumäkeln. Da ich aber jetzt gerade ein Steak auf dem Herd habe, komme ich da später drauf zurück.
Ist nicht mein Code, ich durfte nur den Bug finden + beheben. ;) (Also da war noch mehr zu finden + beheben ;) )
Aber danke für die Hilfe! Jetzt funktionierts 1a. :)
 
So, ich hatte dir ja schon angedroht, daß ich mich noch mal melden würde. ;)

  • Achte auf const-correctness! Deine readMatrix()-Funktion sollte den filename per const char* entgegennehmen.
  • In C++ hat malloc() in der Regel nix verloren. Den Speicher hättest du auch genau so gut per new [] holen können.
  • Warum überhaupt dieses "new [] + placement new" Herumgeeiere? Warum nicht ein std::vector< Distance >, auf den du in jedem Schleifendurchlauf mit push_back() ein neues Distance-Objekt draufpackst?
 
Ich werde es an die Person, die den Code geschrieben hat, weiterleiten ;)
Aber nochmal Danke für die Hilfe!
 
Zurück
Oben