Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » getline aus Dateistream mit Vektor statt c-array (Anfänger)

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
13.01.2019, 21:36 Uhr
Listingleser



Hallo,
möchte ohne c-array (chr ls_zeile[1024]) einen String (csv-Datensatz mit Strichpunkt-Trenner) mit getline lesen (bis Zeilenende). Ich bekomme einfach die richtige Syntax nicht hin da Anfänger. Sollte dann ein moderner vector bitte sein.
Im späteren Schritt wird der csv-Datensatz in seine Einzeldaten zerlegt.
Kann mir jemand helfen?
Wäre super
Danke


C++:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

std::vector<std::string> f10_explode( const std::string &delimiter, const std::string &explodeme);


//********************************************
int main(int argc, char *argv[])
{

    std::string ls_zeile{"auto;lkw;bus"};

    std::ifstream csvstream{"/home/linux/testdateien/csv_explode.csv"};
    if (csvstream.fail()) {
        std::cerr << "Datei konnte nicht geöffnet werden" << std::endl;
        return -1;
    }

    //char ls_zeile[1024]= {};

    while (csvstream.getline(ls_zeile, 1024)) {   // ????? hier ????
        if (csvstream.fail()) {
            return -1;
        }
    }
    std::vector<std::string> v = f10_explode(";", ls_zeile);

    for(unsigned int i=0; i<v.size(); i++) {
        std::cout <<i << " ["<< v[i] <<"] " <<std::endl;
    }
}

std::vector<std::string> f10_explode( const std::string &delimiter, const std::string &str)
{
    std::vector<std::string> arr;

    int strleng = str.length();
    int delleng = delimiter.length();
    if (delleng==0)
        return arr;//no change

    int i=0;
    int k=0;
    while( i<strleng ) {
        int j=0;
        while (i+j<strleng && j<delleng && str[i+j]==delimiter[j])
            j++;
        if (j==delleng) { //found delimiter
            arr.push_back(  str.substr(k, i-k) );
            i+=delleng;
            k=i;
        } else {
            i++;
        }
    }
    arr.push_back(  str.substr(k, i-k) );
    return arr;
}



Dieser Post wurde am 13.01.2019 um 21:37 Uhr von Listingleser editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.01.2019, 09:31 Uhr
ao

(Operator)



Zitat von Listingleser:
ohne c-array

Löblich!


Zitat:

C++:
    while (csvstream.getline(ls_zeile, 1024)) {   // ????? hier ????
        if (csvstream.fail()) {
            return -1;
        }
    }



Mit istream::getline geht das leider nicht. Du musst std::getline benutzen:

C++:
while (std::getline(csvstream, ls_zeile))
{
/* diese Zeile auswerten */
}



Und das hier ist ziemlich haarsträubend. Benutze str.find, um den Delimiter zu suchen, und dann str.substr zum Zerschneiden. Das wird viel übersichtlicher.

C++:
    int i=0;
    int k=0;
    while( i<strleng ) {
        int j=0;
        while (i+j<strleng && j<delleng && str[i+j]==delimiter[j])
            j++;
        if (j==delleng) { //found delimiter
            arr.push_back(  str.substr(k, i-k) );
            i+=delleng;
            k=i;
        } else {
            i++;
        }
    }


Dieser Post wurde am 15.01.2019 um 09:35 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: