tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
2436
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MaRlik MaRlik ist offline Mitglied Bronze
    Registriert seit
    Apr 2009
    Beiträge
    32
    Hallöchen,

    ich bin gerade verzweifelt daran, eine CSV Datei zu lesen und den Inhalt in einem Array zu speichern. Die Inhalte in der CSV sind Text und Zahlen. Die Datei sieht so aus:

    Code :
    1
    2
    3
    
    10.0.0;Lambsheim Raiffeisenstrasse;LA1;LA1_DB_10_1025;Raiffeisenstrasse Netzschutz ausgelöst;1;
    10.0.1;Lambsheim Raiffeisenstrasse;LA1;LA1_DB_10_1026;Raiffeisenstrasse Batterie Störung;1;
    10.0.2;Lambsheim Raiffeisenstrasse;LA1;LA1_DB_10_1027;Raiffeisenstrasse Ladegerät Störung;0;

    Nun probiere ich mit diesem c++ code alles einzulesen und in einem Array abzulegen:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    
    #include <fstream.h>
    #include <stdio.h>
    #include <iostream.h>
    #include <sstream.h>
     
    using namespace std;
     
    main()
    {
      // öffnen Datei
      fstream datei1("C:\\Programme\\Borland\\CBuilder6\\Projects\\csv_einlesen\\DIG_ALFA.CSV", ios::in);
     
      if ( datei1.good() )
      {
        // Konvertierungsstreams
        istringstream is,temp;
        string inhaltzeile;
     
        // Ermitteln der Anzahl der Eintraege //
        // Vorlesen
        getline(datei1,inhaltzeile);
     
        // Zähler auf 0 wegen Vorlesen
        int anzahl_eintraege = 0;
     
        while ( !datei1.eof() )
        {
          // Anzahl +1
          anzahl_eintraege++;
          // Nachlesen
          getline(datei1,inhaltzeile);
        }
     
        printf ("%d Elemente!\n\n",anzahl_eintraege);
     
        // Strukt erzeugen
        typedef struct {
          int DB;
          int Byte;
          int Bit;
          string Name;
          string Name_kurz;
          string Name2;
          string Meldetext;
          bool no_nc;
        } DIG_ALFA_typ;
     
        // Anlegen Array für Datei
        DIG_ALFA_typ * feld;
        feld = (DIG_ALFA_typ*) malloc(anzahl_eintraege * sizeof (DIG_ALFA_typ) );
     
        // Eigentliches auslesen und umladen in array !
        // Zurück an Anfang!
        datei1.clear(0);
        datei1.seekg(0L,ios::beg);
     
        // Vorlesen
        getline(datei1,inhaltzeile);
        int element = 0;
     
        while ( !datei1.eof() )
        {
          // Zeile ingelesen in is
          is.str(inhaltzeile);
     
          // Temp vars ...
          string DB_str;
          string Byte_str;
          string Bit_str;
          string no_nc_str;
          string blubb;
          int intzahl;
     
          // Einzelnen Elemente auslesen
          getline(is,DB_str,'.');
          temp.str( DB_str );
          temp >> intzahl;
     
    //      temp >> feld[element].DB;
          getline(is,Byte_str,'.');
          temp.str( Byte_str );
          temp >> feld[element].Byte;
          getline(is,Bit_str,';');
          temp.str( Bit_str );
          temp >> feld[element].Bit;
          getline(is,blubb,';');
          getline(is,blubb,';');
          getline(is,blubb,';');
          getline(is,blubb,';');
     
     
          printf("%c%c%c",blubb[0],blubb[1],blubb[2]);
     
    //      getline(is,feld[element].Name,';');
    //      getline(is,feld[element].Name_kurz,';');
    //      getline(is,feld[element].Name2,';');
    //      getline(is,feld[element].Meldetext,';');
     
    //      printf("%s",blubb);
     
          getline(is,no_nc_str,';');
          temp.str( no_nc_str );
          temp >> feld[element].no_nc;
     
          cout << "DB: " <<  DB_str << " " << intzahl << " Byte: " << Byte_str << " Bit: " << Bit_str << " NO_NC: " << no_nc_str << endl;
     
          // Zeiger erhöhen
          element++;
     
          // Nachlesen
          getline(datei1,inhaltzeile);
        }
     
        // Schließen Datei
        datei1.close();
     
        // Speicher freigeben
        free(feld);
     
      }
      else
      {
        printf("Fehler: Datei nicht vorhanden\n");
      }
     
      getchar();
    }

    Der Teil in dem ich die Anzahl der Felder auslese, speicher für das array reserviere usw. sollte eigentlich soweit passen. Klappt auch.

    Beim Auslesen der einzelnen Inhalte zu ich mir leider recht schwer. Immer die Konvertierungen usw. die in meinen Augen "hingebogen" sind, aber anders klappts nicht. Die Konvertierung in Zeile 77 funktioniert genau beim ersten eintrag, danach z.B. nicht mehr.

    Ein größeres Problem ist aktuell der Versuch den Namen usw aus der TXT auszulesen und in das Array zu packen. Klappt nie, da es immer Probleme mit der Konvertierung gibt.

    Was könnt ihr mir raten? Wo hab ich große Fehler drin? Wie kann man es eleganter machen?

    Ich bin um jede Hilfe und auch im Kritik dankbar!
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Ich hab dein Programm mal etwas verbessert, die gröbsten Fehler beseitigt und den Code mehr im C++ Stil gestaltet.

    Zu deinen Fehlern:
    • C++ Headerdateien haben keine Endung. D.h. es muss iostream und nicht iostream.h heißen. Headerdateien der C Bibliothek werden in C++ mit dem Präfix c und auch ohne Endung eingebunden - also cstdio und nicht stdio.h usw.
    • du liest irgendetwas ein und prüfst nicht ob das Einlesen überhaupt erfolgreich war
    • du verwendest die .eof() Methode in einer Schleife. Das ist falsch. Die .eof() .good(), fail() und bad() Methoden benötigt man fast nie, nur wenn man sich damit auskennt.
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
     
    using namespace std;
     
    // Strukt erzeugen
    typedef struct {
        int DB;
        int Byte;
        int Bit;
        string Name;
        string Name_kurz;
        string Name2;
        string Meldetext;
        bool no_nc;
    } DIG_ALFA_typ;
     
    ostream& operator<< (ostream& out, const DIG_ALFA_typ& d) {
        return 
            out << d.DB << '.' << d.Byte << d.Bit << ';'
                << d.Name << ';' << d.Name_kurz << ';'
                << d.Name2 << ';' << d.Meldetext << ';'
                << d.no_nc << ';';
    }
     
     
    int main() {
        // öffnen Datei
        ifstream datei1("data.csv");
     
        if ( datei1.is_open() )
        {
            string inhaltzeile;
            vector<DIG_ALFA_typ> content;
     
            while (getline(datei1,inhaltzeile)) {
                DIG_ALFA_typ entry;
                
                istringstream is(inhaltzeile);
                
                if (is >> entry.DB   && is.get() == '.' &&
                    is >> entry.Byte && is.get() == '.' &&
                    is >> entry.Bit  && is.get() == ';' &&
                    getline(is, entry.Name, ';') &&
                    getline(is, entry.Name_kurz, ';') &&
                    getline(is, entry.Name2, ';') &&
                    getline(is, entry.Meldetext, ';') &&
                    is >> entry.no_nc && is.get() == ';') 
                {
                    content.push_back(entry);
                } else {
                    cerr << "could not parse input line: " << inhaltzeile << endl;
                }
            }
            cout << content.size() << " Elemente!\n\n";
     
            copy(content.begin(), content.end(),
                 ostream_iterator<DIG_ALFA_typ>(cout, "\n"));
        } else {
            cerr << "could not open file." << endl;
        }
            cin.get();
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    MaRlik MaRlik ist offline Mitglied Bronze
    Registriert seit
    Apr 2009
    Beiträge
    32
    Viele Dank! Hab mich mal in die Befehle usw eingelesen, nun ist mir auch da fast alles verständlich.

    Ich denke der Rest kommt mit der Zeit! Vielen Dank nochmal!
     

  4. #4
    Avatar von devDevil
    devDevil devDevil ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Beiträge
    662
    Da das hier verlinkt wurde von http://www.tutorials.de/forum/c-c/33...tei-fread.html ...

    Unter C++ ist das typedef vor der struct wohl eher unüblich. Dann bietet sich an hier auch operator>> zu überladen anstatt das direkt inner main zu machen. Dann kann das einlesen zu nem ein-(max. zwei-)zeiler werden. (std::copy o. c-tor + istream_iterator).
     

Ähnliche Themen

  1. VB Textfile auslesen, in 2d Array speichern
    Von rollerueckwaerts im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 04.12.09, 08:24
  2. Array in Datei speichern
    Von JimboJT im Forum C/C++
    Antworten: 11
    Letzter Beitrag: 07.05.08, 14:27
  3. Antworten: 4
    Letzter Beitrag: 12.12.07, 12:14
  4. Datei unter VB öffnen, auslesen und im Array speichern
    Von FunthomasX im Forum Visual Basic 6.0
    Antworten: 11
    Letzter Beitrag: 07.04.05, 09:48
  5. Array in Datei Speichern
    Von BFreakout im Forum PHP
    Antworten: 3
    Letzter Beitrag: 02.04.04, 23:09