tutorials.de Buch-Aktion 05/2012
Like Tree7Danke
  • 1 Beitrag von cwriter
  • 1 Beitrag von Steiner_B
  • 1 Beitrag von Steiner_B
  • 1 Beitrag von Steiner_B
  • 1 Beitrag von Steiner_B
  • 1 Beitrag von Steiner_B
  • 1 Beitrag von Steiner_B
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
941
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    fujifilm fujifilm ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    19
    Moin,

    nachdem mir heute schon super geholfen wurde; habe ich 2,3 weitere Fragen.
    Ich habe schon fleißig das Netz abgesucht und ein paar Hinweise gefunden. Allerdings noch keine zufriedenstellende Lösung.

    String in String suchen:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    string zeile="sehr viel Text in dem auch mal AR   vorkommt"
     
    size_t found;
    found = zeile.find("AR  ");
                if(found != string::npos)
                    {
                        ar=0;
                    }

    Dazu habe ich nur "Lernfragen".
    1) Wofür steht das size_t?
    2) Wofür steht das string::npos?
    3) Gibts so ne Art "c++ Allesbibliothek" bei der ich solche nachlesen kann? Dann würde ich sie hier nicht mehr stellen

    String zerlegen:
    In meiner Datei sind Zahlen durch Leerzeichen getrennnt. Vom Algorithmus würde ich es so machen:

    1) Finde Postion des ersten Leerzeichens [das kann ich ja jetzt schon]
    2) Kopiere String vom ersten Buchstaben bis zum Leerzeichen
    3) Wandle String in double um
    4) Kopiere Double in Feld [das kann ich glaub auch]
    5) Lösche Kopierten String und fange bei 1) an


    Wäre nice, wenn ihr mir wieder so gut wie gestern & heute helfen konntet.


    Vielen Dank und beste Grüße
    Fuji
     

  2. #2
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Hallo

    1.1) size_t ist dasselbe wie unsigned int (=ULONG_PTR) http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx. Was es bedeutet, weiss ich aber auch nicht.

    1.2) http://www.cplusplus.com/reference/string/string/npos/ Ich denke, es heisst number of position

    1.3) Ja, die gibts. MSDN oder http://www.cplusplus.com/. Um etwas zu suchen, gib die Suche gefolgt von "msdn" bei Google ein. Das ist genauer als die Bing-Suche in der MSDN.

    Zu den 2. Fragen habe ich keine Antwort, da ich mich mit Streamklassen nicht so gut auskenne. Wenn du willst, kann ich dir die c-Funktionen zeigen. Die funktionieren auch.

    Gruss
    cwriter
    fujifilm bedankt sich. 
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  3. #3
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    Zum 2. Problem:
    Ich würde wie folgt vorgehen:
    1. Zahlenstring = ""
    2. Ein Zeichen einlesen
    3. Wenn Zeichen != Leerzeichen -> an Zahlenstring anhängen
    Wenn Zeichen == Leerzeichen -> Zahlenstring z.B.: mit atof in double umwandeln und Zahlenstring = ""
    fujifilm bedankt sich. 

  4. #4
    fujifilm fujifilm ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    19
    Moin ihr beiden,

    vielen Dank schonmal fürs Helfen.


    Mit welchem Befehl les ich denn das nächste Zeichen ein?

    Grüße
    Fuji
     

  5. #5
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    Wenn du einen ifstream verwendest, dann ifstream.get(). Wenn du c-style File-Handling mit fopen usw. verwendest dann fgetc().
    fujifilm bedankt sich. 

  6. #6
    fujifilm fujifilm ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    19
    Moin Steiner_B,

    bei mir siehts jetzt so aus und er meckert ein wenig:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    datei.fgetc(buffer); //fgetc()
                        if (buffer==" ")
                        {
                            zahlInDouble = atof(zahlInBuchstaben.data());
                            NasaKoeff[speziesZuweisung-1][Koeff]=zahlInDouble;
                            Koeff++;
    }

    Fehlermeldungen:

    ..\Nasakoeff.cpp:48: error: 'struct std::string' has no member named 'fgetc'
    ..\Nasakoeff.cpp:49: warning: comparison with string literal results in unspecified behaviour
    ..\Nasakoeff.cpp:49: error: ISO C++ forbids comparison between pointer and integer
    ..\Nasakoeff.cpp:51: error: 'atof' was not declared in this scope


    Viele Grüße
    Fuji
     

  7. #7
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    Zeile 48: Schau in die Doku, fgetc ist auch kein Member von String. Wenn du die Daten schon als String hast musst du außerdem in einer Schleife drüberwandern und einfach an der richtigen Stelle im String nachschauen. Deine ursprüngliche Frage was ja auf eine Datei bezogen.
    Zeile 49: Welchen Typ hat den Buffer? Wenns ein char ist musst du ihn auch mit einem Char vergleichen. Strings werden in " eingeschlossen, chars in ' .
    Zeile 49(2): Ist buffer ein char*? Dann musst du ihn zuerst dereferenzieren.
    Zeile 51: Schau in der Doku nach in welcher Headerdatei atof deklariert ist. Nebenbei: Wenn zahlInBuchstaben ein String ist, bekommst du den c-string mit .c_str() und nicht mit .data()
    fujifilm bedankt sich. 

  8. #8
    fujifilm fujifilm ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    19
    Moin Steiner_B,

    vielen Dank für die Hilfe.
    Habe alles korrigiert. Mir fehlt nur noch der Befehl um ein String auf Buchstaben zu durchsuchen.
    Das mit einer for-Schleife würde ich hinkriegen, mir fehlt nur der Befehl, zeile.position oder so.
    Also das er bei Buchstaben "1" anfangen soll. Habe dazu Sachen im Netz gefunden, die leider nicht funktionieren.

    mfg
    fuji

    ps.: Wenn das funktioniert bin ich mit der .txt-Datei durch )
    Geändert von fujifilm (23.09.11 um 12:22 Uhr)
     

  9. #9
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Wenns ein std::string ist: Der hat eine find-Methode. Oder hab ich die Frage jetzt nicht verstanden?
    fujifilm bedankt sich. 

  10. #10
    fujifilm fujifilm ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    19
    Ist ein std::string.

    Ich will folgendes machen:

    Checke String an Postion 1? <== das bekomme ich noch nicht hin.
    Ist es ein Leerzeichen?
    Wenn nein füge die Zahl dem String zahlInBuchstabe hinzu
    Wenn doch wandle zahlAlsBuchstabe in zahlInDouble um. <== das atof .data braucht habe ich irgendwo im Netzt gelesen. Wenns nachher nicht funktioniert, verwende ich .c_str().

    Das habe ich bisher so umgesetzt:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    for (int i=0,i!=50,i++)
    {
                      if (*buffer==' ')
                        {
                            zahlInDouble = atof(zahlInBuchstaben.data());
     
                            NasaKoeff[speziesZuweisung-1][Koeff]=zahlInDouble;
                                                    i=50;
                            Koeff++;
                            if (Koeff==4)
                            {
                                Koeff=0;
                            }
                        }
                        else
                        {
                            zahlInBuchstaben += *buffer;
                        }
                     }
    }


    mfg
    fuji
    Geändert von fujifilm (23.09.11 um 12:25 Uhr)
     

  11. #11
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    String an position 1: string.c_str()[1]. Soweit ich deinem Code aber jetzt entnehmen kann müsste eh alles stimmen, bis darauf, dass du im Falle eines Leerzeichens noch zahlInBuchstaben auf "" zurücksetzten musst.
    Daher die Frage: Wo willst du nochmal auf Leerzeichen prüfen?
    fujifilm bedankt sich. 

  12. #12
    fujifilm fujifilm ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    19
    Innerhalb des stringes, den ich aus einer datei zuvor schon per getline in mein programm importiert habe.

    Okay; dann probier ichs mit zeile.c_str()[1].
     

  13. #13
    fujifilm fujifilm ist offline Mitglied
    Registriert seit
    Sep 2011
    Beiträge
    19
    Funktioniert; hier noch der Teil des Programmes:

    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
    
    for (k=1;k!=85;k++)
                    {
                        buffer=zeile.c_str()[k];
     
                        if (buffer==' ')
                        {
                            cout<<zahlInBuchstaben<<endl;
                            zahlInDouble = atof(zahlInBuchstaben.data());
                            zahlInBuchstaben = "";
     
                            NasaKoeff[speziesZuweisung-1][Koeff]=zahlInDouble;
     
                            Koeff++;
                            if (Koeff==4)
                            {
                                Koeff=0;
                            }
                        }
                        else
                        {
                            zahlInBuchstaben += buffer;
                        }
    }
     

  14. #14
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    Naja, wenn du den String eh schon als ganzes im Speicher hast kannst dus überhaupt anders angehen:

    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
    
    string s("14 13.5 8.9 400.12");
     
        char* cstring = (char*)s.c_str();
        int l = s.length();
        int numberOfNumbers = 0;
     
        //Alle Leerzeichen durch '\0' = StringEnde ersetzen
        for (int i = 0; i < l; i++)
        {
            if (cstring[i] == ' ')
            {
                cstring[i] = '\0';
                numberOfNumbers++;
            }
        }
     
        //Pointer auf den ersten Zahlenstring setzen
        char* startp = cstring;
     
        //Alle Zahlenstrings durchlaufen
        for (int i = 0; i <= numberOfNumbers; i++)
        {
            //Umwandlung nach double
            double d = atof(startp);
            std::cout << d << std::endl;
     
            //Auf den Beginn des nächsten Zahlenstrings setzen
            startp += strlen(startp) + 1;
        }

    Da fällt nämlich der Aufwand für das kopieren der Zahlen in einen neuen String weg.
    fujifilm bedankt sich. 

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 05.01.09, 15:25
  2. [C++]Nach String suchen, teilen und speichern
    Von Seelenquell im Forum C/C++
    Antworten: 27
    Letzter Beitrag: 25.06.07, 09:27
  3. Antworten: 9
    Letzter Beitrag: 30.05.07, 16:02
  4. string zerlegen
    Von anfeanger83 im Forum PHP
    Antworten: 1
    Letzter Beitrag: 18.08.06, 10:11
  5. String zerlegen
    Von ulf123 im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 1
    Letzter Beitrag: 28.05.06, 22:38