Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Falsche Ausgabe bei CSV Datensatz in vectoren einlesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.12.2005, 10:55 Uhr
~hallo_eva
Gast


Hallo.

ich schreibe gerade an einem Programm, das aus einem Cvs File Daten ausliest, und diese dann in einem STL Vector ablegt, so dass man dann in diesen Vektoren suchen kann. Der Compiler schluckt meinen Code, allerdings wird das falsche ERgebnis ausgegeben. Hoffentlich könnt ihr mir helfen:

Datenbank.cpp

C++:
#define delimiter ";"
#include <windows.h>
#include <vector>
#include <iterator>
#include <fstream>

#include <iostream>
#include <string>


using namespace std;
using std::copy;
using std::cout;
using std::ostream_iterator;
using std::vector;


#include  "stdafx.h"
#include "data.h"


#define inputfile "C:\\Daten1.csv"
#define MAX_LINESIZE 250

//---------------------Daten zeile für Zeile einlesen ---------------


void readData(vector<Data> &data) {
  std::ifstream ifs("c:\\Daten1.csv");      
  
        if (!ifs) {
            cout << "Kann nicht geöffnet werden " << "c:\\Daten1.csv" << endl;
            exit(1);
        }
        char line[MAX_LINESIZE];
        while (!ifs.eof()) {
            ifs.getline(line, MAX_LINESIZE,';');
            Data::readDt(data, line);
            ;
        }
        ifs.close();
        std::ostream_iterator <Data> output(cout, "\n");
        std::copy(data.begin(), data.end(), output);
        }


void main()

{
//----------- Vektor erzeugen und ReadData aufrufen ----------------------
       vector <Data> pv;
       readData(pv);

    Sleep(100000);
    
    }



Meine Header:


C++:
#if !defined(DATA_H)

#define DATA_H
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>

using std::cout;
using std::endl;
using std::ostream;
using std::string;


/** -------------------------  Klasse Data ---------------------------**/
class Data {

public:
      Data();
  
      Data (int, int, string, string, string);
      
      int getId () const;                               //Definition der Funktionen
      int getHsv() const;
      string getName() const;
      string getArtist() const;
      string getPath() const;
      static void readDt(std::vector<Data> &data, char *line);
      void print() const;
      
      int id;
      int hsv;
      string name;
      string artist;
      string path;
      friend ostream &operator<<(std::ostream &output, const Data &p);
};
#endif


Data::Data() {}
Data::Data(int i, int h, string n, string a, string p) : id(i), hsv(h), name(n), artist(a), path(p) {}

int Data::getId() const {
    return id;
}

int Data::getHsv() const {
    return hsv;
}

string Data::getName() const {
    return name;
}
string Data::getArtist() const {
    return artist;
}

string Data::getPath() const {
    return path;
}
void Data::print() const {
    cout << *this ;}


ostream &operator<<(std::ostream &output, const Data &p) {
        output << "\nFile on ";
        output << p.name << " " << p.artist << endl;
        output << "Id: " << p.id << endl;
        output << "HSV: " << p.hsv << endl;
        output << "Pfad: " << p.path << endl;
        output << endl;
        return output;
      }

/** -------------Daten in Vektor einlesen ------------------**/
void Data::readDt(std::vector<Data> &data, char *line) {
    Data dt;
    
    if (!line[0]) return;
    char *token = strtok(line, delimiter);

    token = strtok(NULL, delimiter);
      //ID
    if (token!=NULL) {
          dt.id = atoi(token);
    }
    
    token = strtok(NULL, delimiter);
    //HSV
    if (token!=NULL) {
        dt.hsv = atoi(token);
    }
  
    token = strtok(NULL, delimiter);
    //Name
    if (token!=NULL) {
      dt.name = string(token);
    }
    token = strtok(NULL, delimiter);
      //Künstler
    if (token!=NULL) {
        dt.artist = string(token);
    }
    token = strtok(NULL, delimiter);
    //Pfad  
    if (token!=NULL) {
        dt.path = string(token);
    }

    data.push_back(dt);      
}




Zur Vollständigkeit auch noch mein Csv Datensatz:

Zitat:

1;250;Blaues Pferd;Franz Marc;Cblue_horse_col.bmp
1;123;No Name;Cesanne;CCesanne.bmp
1;120;Sunflowers;Van Gogh;CvanGogh.bmp
1;3;Test;Testkünstler;Ctest.bmp

2;;Blaues Pferd;Franz Marc;Cblue_horse_col.bmp
2;;No Name;Cesanne;CCesanne.bmp
2;;Sunflowers;Van Gogh;CvanGogh.bmp
2;;Test;Testkünstler;Ctest.bmp

3;;Blaues Pferd;Franz Marc;Cblue_horse_col.bmp
3;;No Name;Cesanne;CCesanne.bmp
3;;Sunflowers;Van Gogh;CvanGogh.bmp
3;;Test;Testkünstler;Ctest.bmp




Vielen vielen Dank für eure Mühe

Liebe Grüße
Eva
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.12.2005, 10:59 Uhr
~hallo_eva
Gast


Ui das Ergebnis sieht so aus:

41 mal das selbe:

Zitat:

File on
Id: -858993460
HSV: -858993460
Pfad:



Liebe Grüße
Eva
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.12.2005, 11:14 Uhr
Tommix



Hallo,
Du liest nur bis zum ';' ein. Mach mal

C++:
// ...
        char line[MAX_LINESIZE];
        while (!ifs.eof()) {
            ifs.getline(line, MAX_LINESIZE,'\n'); // << !
            Data::readDt(data, line);
            ;
// ...


Dann geht es zwar immer noch etwas durcheinander, sieht aber schon deutlich besser aus.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.12.2005, 11:29 Uhr
ao

(Operator)


Hi Eva, hast du es schon mal mit einem Debugger versucht?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.12.2005, 11:33 Uhr
~Hallo_eva
Gast


Das funktioniert ganz fein, allerdings ist das Ergebnis jetzt immernoch ziemlich falsch.
Vielen Dank
Ich habe:


C++:
cout << "parsing '" << line << "'" << endl;


in meine readDt eingefügt.

Gibts mir alle zeilen ordentlich an.

Nur das Ergebnis ist dann nicht so gut. Er gibt jetzt 12 Sätze aus.

mit:


Zitat:

File on "Künstlername" "Pfad"
Id: "HSV-Wert"
Hsv: O
Pfad:





Jedes Bild wird 3 mal ausgegeben allerdings beim 2. und 3. Mal mit nur Pfad hinter "File on" und snst nix.

Ich komm nicht dahinter woran es liegt?
Lese ich die Zeilen falsch ein?

Vielen Dank
Eva
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.12.2005, 11:58 Uhr
Tommix



Was sollte denn ausgegeben werden (Beispiel)?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.12.2005, 11:59 Uhr
ao

(Operator)


Noch mal, Eva: Wenn ein Programm sich komisch verhält, untersuch es im Debugger.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.12.2005, 12:21 Uhr
Tommix



Ich denke ich hab ihn:
Zum einen rufts Du strtok einmal zu viel auf:

C++:
void Data::readDt(std::vector<Data> &data, char *line) {
    Data dt;
    
    if (!line[0]) return;
    char *token = strtok(line, delimiter);

//   raus: token = strtok(NULL, delimiter);
      //ID
    if (token!=NULL) {
          dt.id = atoi(token);
    }


Dann klappt schon mal der erste Datensatz.
Zum zweiten werden führende Delimiter übersprungen. Daraus ergibt sich, daß keine leeren Einträge (;;) auftreten dürfen, bzw. übersprungen werden. Sieh dir mal das Beispiel zu strtok im MSDN an, da sieht man das.

Tommix

Dieser Post wurde am 16.12.2005 um 12:22 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.12.2005, 13:25 Uhr
~hallo_eva
Gast


Sehr schön, vielen Dank.

Es funktioniert.

Schönes WE wünsch ich euch !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: