[C/C++] Strings von Anführungszeichen befreien und in Variable speichern

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Characticl D, 3. September 2009 .

  1. 3. September 2009
    Strings von Anführungszeichen befreien und in Variable speichern

    Hallo Leute,

    bin noch ziemlicher Anfänger in C++.
    Hier ist mal mein Code bis dato:

    Code:
    #include <iostream>
    #include "Auftraege.h"
    #include "Auftrag.h"
    
    using namespace std;
    
    void Auftraege::tabTrennen( istream &input, vector< vector<string> >& output ) {
     string line;
     // Zeilenweise einlesen
     while( getline( input, line ) ) {
     istringstream stream( line );
     vector<string> column;
     string element;
    
     // Trennzeichen Tabulator, jedes Element in Vector einlesen
     while( getline( stream, element, '\t') ) {
     column.push_back( element );
     }
     
     // Zeile an Ergebnis anhängen
     output.push_back( column );
     }
    }
    
    int Auftraege::Einlesen (const char *filename)
    {
     
     // Datei öffnen
     fstream file(filename, ios::in );
     if( !file.is_open()) {
     cout << "Datei wurde nicht gefunden!" << endl;
     system ("PAUSE");
     return 1;
     }
     // Vector für Daten definieren
     typedef vector< vector<string> > cVector;
     cVector data;
    
     // Datei in Vector einlesen
     tabTrennen( file, data );
    
     // Vector ausgeben
     for( cVector::iterator i = data.begin(); i != data.end(); ++i ) {
     for( vector<string>::iterator j = i->begin(); j != i->end(); ++j ) {
     cout << *j;
     }
     cout << endl;
     }
     
    
     }
    
    int main ()
    {
     Auftraege *aufVorher = new Auftraege ("data\\vorhermini.txt");
    // Auftraege *aufNachher = new Auftraege ("data\\nachher.txt");
    
    // aufVorher->Differenz (*aufNachher);
    
     system ("PAUSE");
     return 0;
    }
    
    
    Eingelesen wird ein Datenbanksatz mit folgender Struktur:

    Code:
    "Auftragsnummer" "Auftragsdatum" "Name" "Vorname" "..."
    Die einzelnen Einträge sind jeweils durch Tabs getrennt.
    Wie ihr im Code sehen könnt, habe ich die Tabs schon entfernt.

    Jetzt muss ich als nächsten Schritt die einzelnen Einträge ohne die Anführungszeichen in einer Variable speichern.

    Ich sitze schon bestimmt zwei Tage und finde keinen Ansatz

    Kann mir jemand helfen?
     
  2. 3. September 2009
    AW: Strings von " " befreien und in Variable speichern

    Für solche Dinge bedien ich mir immer die Boost Library.

    Aus Wikipedia:
    Für dich sollte vor allem boost::tokenizer interessant sein.

    Ein Beispiel aus der Dokumentation:
    Code:
    // simple_example_1.cpp
    #include<iostream>
    #include<boost/tokenizer.hpp>
    #include<string>
    
    int main(){
     using namespace std;
     using namespace boost;
     string s = "This is, a test";
     tokenizer<> tok(s);
     for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
     cout << *beg << "\n";
     }
    }
    
    /*
    The output from simple_example_1 is:
    
     This
     is
     a
     test
    */
    
    Um eigene Trenner festzulegen, schau dir mal char_separator an: Boost Char Separator - 1.40.0

    Ich hoffe, ich konnte dir damit weiterhelfen.
     
  3. 3. September 2009
    AW: Strings von " " befreien und in Variable speichern

    Schau dir mal die Referencen des Typs/der Klasse String an!

    Mit dem Operator [] ermitteln ob am anfang und am Ende des Strings das Zeichen " vorhanden ist und entweder mit erase die Zeichen löschen oder mit substr den Inhalt ohne die Anführungszeichen harauskopieren und neu zuweissen.

    Mfg Rushh0ur
     
  4. 3. September 2009
    AW: Strings von " " befreien und in Variable speichern

    Bei eigenen Implementationen besteht oftmals das Problem, dass man Fehler einbaut, die man auf den ersten Blick nicht sieht. (Z.B. erst ein Sonderfall führt zum Segfault..) Bei der Nutzung von vielfach eingesetzten Libarys ist dies unwahrscheinlicher.
     
  5. 3. September 2009
    AW: Strings von " " befreien und in Variable speichern

    Kannst du mir vielleicht ein Beispiel zeigen?
    Bin wie gesagt Neuling und kenne mich noch nicht so gut aus.

    @chrisb:

    Die Boost-Library darf ich nicht benutzen, ich soll alles selber machen?
    (Aufgabenstellung)
     
  6. 3. September 2009
    AW: Strings von " " befreien und in Variable speichern

    Die Boost Library ist quelloffen, d.h. du könntest dir ja mal die tokenizer.hpp anschauen

    So spontan würde ich es dann so angehen:
    Code:
    std::vector<std::string> words;
    std::string str = "..................";
    
    while (!str.empty()) {
     std::string::size_type start = str.find("\"");
     std::string::size_type end = str.find("\"", start);
    
     std::string cur = str.substr(start, end);
     words.push_back(cur);
    
     str.erase(start, end);
    }
    
    Keine Garantie. Ist momentan noch ungetestet und eine Überlegung.

    Die getestete Version sieht schon anders aus:
    Code:
    #include <iostream>
    #include <string>
    #include <vector>
    
    int main() {
     std::vector<std::string> words;
     std::string str = "\"test\"\"lalala\"\"abcd\"";
    
     while (!str.empty()) {
     std::string::size_type start = str.find_first_of("\"");
     std::string::size_type end = str.find_first_of("\"", start + 1);
    
     if (start == std::string::npos || end == std::string::npos)
     break;
     
     std::string cur = str.substr(start + 1, end - 1);
     words.push_back(cur);
    
     str.erase(start, end + 1);
     }
     
     for (unsigned int i = 0; i < words.size(); ++i)
     std::cout << words[i] << std::endl;
    }
    
    Auch hier bekommst du keine Garantie, dass diese Lösung alle Fälle miteinbezieht.
     
  7. 3. September 2009
    AW: Strings von " " befreien und in Variable speichern

    Sieht gut aus, nur irgendwie hängt sich das Programm aus unerklärlichen Gründen auf ?(
    Was du mir noch beantworten könntest:

    Ich habe ja oben meine Zeilen in dem Vektor drin, ohne Tabs.
    Wie komme ich an nur eine dieser Zeilen ran, also wie kann ich nur eine von denen ausgeben?

    Achja, BW haste übrigens
     
  8. 3. September 2009
    AW: Strings von Anführungszeichen befreien und in Variable speichern

    Du hast mein Edit noch nicht gesehen..

    Das Programm hat sich nicht aufgehängt, die Abbruchbedinung der Schleife wurde nur nie erreicht.. (Auch war die Suche nach den " nicht ganz korrekt implementiert..)

    Zu deiner Frage: Du wandelst den Code in eine Funktion um und gehst in einer Schleife jedes einzelne Element des Vectors durch, welches du dann an die neue Funktion übergibst.
     
  9. 5. September 2009
    AW: Strings von Anführungszeichen befreien und in Variable speichern

    Hier ein fertige Funktion die dir die Anführungszeichen am Anfang und am Ende entfernt:

    PHP:
    string UnQuotedStr  ( string str )
    {
        if (
    str .empty()) return  str
        
        if ((
    str [ 0 ] == * "\"" ) && ( str [ str . length ()- 1 ] == * "\"" )) 
            return 
    str . substr ( 1 str . length ()- 2 );
        else
            return 
    str ;
    }
    Mfg Rushh0ur
     
  10. 5. September 2009
    AW: Strings von Anführungszeichen befreien und in Variable speichern

    Characticl D und ich hatten uns noch via PM unterhalten und haben das Problem gelöst. Im Endeffekt war's der selbe Ansatz mit substr, den auch deine Funktion macht.

    Ausschnitt:
    Ich denke, der Thread kann geclosed werden.
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.