tutorials.de Buch-Aktion 02/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
24
ZUGRIFFE
823
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    lara86 lara86 ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    21
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    #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
     

  2. #2
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Hallo Lara!

    Da gibt es grundsätzlich mehrere Möglichkeiten, hier mal 2 davon:
    Code :
    1
    2
    3
    4
    
    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/i...istringstream/

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

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

    http://www.cplusplus.com/reference/c...cstdio/sscanf/
     

  3. #3
    lara86 lara86 ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    21
    Werd das mal probieren und meld mich dann wieder wies aussieht.
    Erstmal vielen Dank dafür
     

  4. #4
    lara86 lara86 ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    21
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    #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 ?
    Geändert von lara86 (29.05.09 um 13:09 Uhr)
     

  5. #5
    Avatar von Turri
    Turri Turri ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Beiträge
    339
    Hallo,

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

    Vielleicht liegts ja daran.

    MfG Turri
     

  6. #6
    lara86 lara86 ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    21
    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 ?
     

  7. #7
    Avatar von Turri
    Turri Turri ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Beiträge
    339
    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
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.
    Zitat Zitat von lara86 Beitrag anzeigen
    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:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    string buf;
     
    while (getline(datei1, buf)) {
      istringstream iss(buf);
     
      if (iss >> zeile[i]) {
        // Alles OK.
      } else {
        // Error: konnte nicht in double konvertieren.
      }
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    lara86 lara86 ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    21
    Oh super, danke, werde ich direkt mal probieren
     

  10. #10
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    412
    Ich persoöhnlich bevorzuge fprintf und fscanf bei Textdateien kannst du dir ja acuh mal anschauen.
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Zitat Zitat von 3Cyb3r Beitrag anzeigen
    Ich persoöhnlich bevorzuge fprintf und fscanf bei Textdateien kannst du dir ja acuh mal anschauen.
    Obwohl das natürlich ungleich komplizierter und fehleranfälliger ist. Oder weißt du ad hoc ohne Nachzuschauen welchen Formatstring man beim Ausgeben und Einlesen eines float bzw. double nehmen muss?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  12. #12
    lara86 lara86 ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    21
    Jetzt ist noch eine Frage abseits des auslesens von Dateien aufgekommen, bei dem es um Objekte geht.
    Angenommen ich habe 3 Klassen:

    Klasse A
    Klasse B
    Klasse C

    Klasse C besteht nur aus 5 private Variablen und jeweils 5 public Getter- und Setter Methoden um darauf zugreifen zu können.
    Klasse A erstellt sich jetzt ein Klasse C Objekt und trägt dort die eingelesenen Werte über die Settermethoden ein. Geht auch toll.

    Jetzt kommt Klasse B, in der eigtl die Berechnung stattfinden soll, allerdings komm ich ja jetzt nicht mehr an die Werte dran. Wenn ich wieder ein neues Klasse C Objekt erstelle sind die Werte natürlich weg, aber ohne eines zu erstellen kennt er die GetterMethoden ja nicht.

    Muss ich das Objekt aus Klasse A jetzt an Klasse B übergeben ? Oder kann man Methoden anderer Klassen auch aufrufen ohne ein Objekt davon zu erzeugen ?
     

  13. #13
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    412
    Du könntest Klasse C als friend-class zu Klasse B deklarieren und somit auf dir Privat variablen zugreifen, jedoch benutzt man dies heute eigentlich nichtmehr.
    Du kannst dir doch in Klasse A eine Methode schreiben welche den Zeiger auf das Klasse C Objekt liefert und mit diesem in Klasse B arbeiten.


    Zitat Zitat von deepthroat Beitrag anzeigen
    Obwohl das natürlich ungleich komplizierter und fehleranfälliger ist. Oder weißt du ad hoc ohne Nachzuschauen welchen Formatstring man beim Ausgeben und Einlesen eines float bzw. double nehmen muss?

    Gruß
    war das jetzt ironisch gemeint oder willst du mich aufn arm nehmen?
    Geändert von 3Cyb3r (30.05.09 um 14:19 Uhr)
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  14. #14
    lara86 lara86 ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    21
    Okay, nun hab ich mich ne Weile mit Zeigern rumgeschlagen und es nun immerhin mal in Klasse A am laufen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    void Einlesen::speichern(){
         Punkte *newPunkte;
         newPunkte = new Punkte;
         newPunkte->setYA(zeile[0]);
         newPunkte->setXA(zeile[1]);
         newPunkte->setYE(zeile[2]);
         newPunkte->setXE(zeile[3]);
    }

    Damit hab ich die Punkte jetzt in der anderen Klasse gesetzt.
    Nun will ich aus einer dritten Klasse auf diese Punkte zugreifen. Kann ich den Zeiger dann in der dritten Klasse direkt verwenden ? Oder muss ich denn irgendwie übergeben ? Kann man den einfach als Parameter übergeben ? Kriegs nicht so richtig zum laufen
     

  15. #15
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    412
    Du schreibts dir eine Funktion die den Zeiger zutück gibt.
    So wie des es allerding ejtzt gemacht hast wird es auch schlecht funktionieren.

    [CPP]
    class Einlesen{
    private:
    Punkte* Punkte;
    // ......................
    public:
    Einlesen();
    ~Einlesen();

    // ...................
    };


    //in der cpp datei

    void Einlesen::speichern(){
    Punkte= new Punkte;
    Punkte->setYA(zeile[0]);
    Punkte->setXA(zeile[1]);
    Punkte->setYE(zeile[2]);
    Punkte->setXE(zeile[3]);
    }
     
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

Ähnliche Themen

  1. textdateien verarbeiten!? ansatzfrage
    Von maychu im Forum Linux & Unix
    Antworten: 3
    Letzter Beitrag: 12.03.10, 00:36
  2. Textdateien einlesen String als Seperator
    Von Krikus im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 06.07.09, 17:30
  3. BufferedReader: Einlesen von Textdateien in ein JPanel
    Von bocee83 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 4
    Letzter Beitrag: 27.10.05, 19:30
  4. bin auch am Verzweifeln...Textdateien einlesen
    Von Guntpat1981 im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 23.01.05, 13:17
  5. Textdateien mit JAVA einlesen!
    Von Panzer im Forum Java
    Antworten: 7
    Letzter Beitrag: 06.01.04, 12:21