Einlesen von Textdateien und verarbeiten

lara86

Mitglied
Huhu,

bin leider noch ganz frisch was Programmieren angeht, muss es vom Studium aus leider lernen :(
Ziel ist es eine Textdatei mit Werten einzulesen, danach diverese Berechnungen auszuführen und die Ergebnisse in einer neuen Textdatei ausgeben.
Nun bastel sich seit Montag ununterbrochen, die Berechnungen sind fertig, es hapert aber am einlesen...
Derzeit sieht es so aus:

Code:
#include <iostream>
#include <fstream>
#include "Einlesen.h"
using namespace std;

void Einlesen::einlesen()
{
     ifstream datei1;
     datei1.open("C:\\temp\\punkte.txt");
     if(!datei1.is_open())
     {
          cout << "Datei nicht gefunden" << endl;
     }
     else{
          while(!datei1.eof()){
               datei1.getline(Buffer, 250);
               cout << Buffer << endl;
          }
          datei1.close();
     }
}

Funktioniert auch toll, er liest Zeile für Zeile ein und wirft sie wieder aus, da war ich schon glücklich.
Bis ich mich gefragt habe wie ich das jetzt in meine Rechnungen reinbekomme.
Angenommen ich lese in Zeile 1 eine 135 ein, da sieht mein Buffer so aus:

Buffer[0] = 1
Buffer[1] = 3
Buffer[2] = 5

aber wie mache ich daraus jetzt in int oder double um damit rechnen zu können ? Geht das überhaupt ?
Oder war die ganze Einlesesache die ich da mühselig erarbeitet hab sinnfrei ?

Hoffe jmd kann mir helfen :(

lg
 
Hallo Lara!

Da gibt es grundsätzlich mehrere Möglichkeiten, hier mal 2 davon:
Code:
dateil.getline(Buffer, 250);
std::istringstream instrstrm(Buffer);
int ival = 0;
instrstrm >> ival;

Damit wird versucht den Anfang von Buffer in einen int-Wert umzuwandeln.

http://www.cplusplus.com/reference/iostream/istringstream/

Eine weitere Möglichkeit ist sscanf. Dies ist jedoch eher aus C-Zeiten.

Code:
...
int ival = 0;
sscanf(Buffer.c_str(), "%u", &ival);

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
 
So, also das Problem was ich jetzt hatte war das mein Buffer ein char array war und er nie in der Lage war char in int zu konvertieren.
Also musste ein string her. Letzten Endes habe ich jetzt eine string Variable buffer und ein int array zeile[250].
Das schaut nun so aus:

Code:
#include <iostream>
#include <fstream>
#include <sstream>
#include "Einlesen.h"
using namespace std;

void Einlesen::einlesen()
{
     fstream datei1("C:\\temp\\punkte.txt");
     int i = 0;
          while(datei1.good()){
               stringstream sstr;
               getline(datei1, buffer);
               sstr << buffer;
               sstr >> zeile[i];
               i++;
          }
          datei1.close();
}

Klappt soweit auch, in dem Arry steht dann in jedem Feld eine Zahl.
Die nächste Hürde sind nun aber Kommazahlen. Wenn ich aus dem int Array einfach ein double Array mache, geht es aber nicht. Im string steht zwar noch die Kommazahl aber nach dem konvertieren schneidet er den Nachkommeanteil ab. Im Array steht dann nicht mehr 22,73 sondern nur noch 22,00000000000000000.
Wie konvertiere ich jetzt nach double ? :(

lg

Edit: Das scheint nicht am konvertieren zu liegen, ich kann allgemein keine Kommazahlen in ein Array eintragen. Ist das richtig ?
 
Zuletzt bearbeitet:
Hallo,

in deinem letzten Post hast du 22,73 geschrieben.
"Kommazahlen" werden mit Punkt getrennt... also 22.73 ...

Vielleicht liegts ja daran. :)

MfG Turri
 
Oh weh, das sind die Sachen die man nicht weiß wenn man sich erst seit ein paar Tagen damit rumschlägt.
Daran lags wirklich, nun gehts, vielen Dank ;-)

Eine Frage habe ich noch, ist es normal das er aus einer 22.31 im Array eine 22.3099999999 macht ?
 
Hallo,

das müsste nur ein "Anzeigefehler" sein.
Wenn du den Wert aus dem Array in einer neuen Double Variable speicherst,
und diese mal ausgibst, dann müsste die richtige Zahl rauskommen.

MfG Turri
 
Hi.
Eine Frage habe ich noch, ist es normal das er aus einer 22.31 im Array eine 22.3099999999 macht ?
Ja, das ist normal. Gleitkommazahlen (wie double und float) sind mit einer Ungenauigkeit behaftet. Üblicherweise gibt man nur gerundete Werte aus.

Übrigens solltest du niemals die .eof(), good() und .bad() Methoden in der Art und Weise verwenden wie du es getan hast. Man sollte den Erfolg der Leseoperation prüfen, und nicht einfach nur ob vorher alles OK war:
C++:
string buf;

while (getline(datei1, buf)) {
  istringstream iss(buf);

  if (iss >> zeile[i]) {
    // Alles OK.
  } else {
    // Error: konnte nicht in double konvertieren.
  }
}
Gruß
 
Ich persoöhnlich bevorzuge fprintf und fscanf bei Textdateien kannst du dir ja acuh mal anschauen.
 
Zurück