fgets problem



  • HI!

    Bitte lasst euch nicht von der grösse dieser Frage verschrecken,
    es ist eigentlich eine recht simple frage.

    Also folgendes:
    Ich möchte eine datei (FILE *__f_userinfo) mit fopen
    Zeile für Zeile auslesen.

    Den Wert welchen ich zurück bekomme (in var. char *info_string)
    möchte ich mit einer funktion von mir auswerten.

    Hier die funktion:

    std::string explode(char trennzeichen, std::string str, int part)
                       {
                         std::string output;
                          if (part == 0) // Wenn der erste Part gesucht wird
                                         // müssen viele komplizuierte schritte nicht gemacht werden
                             {
                                  string::size_type pos1 = str.find_first_of(trennzeichen);
                                  output = str.substr(0,pos1);
                             }
                             else
                             {
                                 /* Als erstes muss die Anzahl der Trennzeichen in dem
                                    zu Teilendem String festgestellt werden, dies geschieht in
                                    einer Schleife, und wenn die Anzahl (int i) mit (int) part (-1)
                                    übereinstimmt wird die Postition ausfindig gemacht.
                                 */
                                 int s_lengh = strlen(str.c_str());
                                 int match_c = 0;
    
                                 for (int i=0;i<s_lengh;i++)
                                     {
    
                                       if (str[i] == trennzeichen)
                                          {
                                           match_c++;
                                            if (match_c == part)
                                               {
                                                 std::string str_2 = str.substr(i+1, 1000);
                                                 string::size_type pos2 = str_2.find_first_of(trennzeichen);
                                                 output = str_2.substr(0,pos2);
                                               }
                                          }
                                     }
                             }
                         return output;
                       }
    

    So die funktion funktioniert normalerweisse ganz wie sie soll
    sie gibt mir einen teil welchen ich in (int) part angebe zurück.
    Nur wenn ich Sie jetzt wie im folgenden Beispiel aufrufen will funktiert sie nicht.

    FILE * __f_userinfo;
         char * info_string;
         char * safe;
         __f_userinfo = fopen(argv[1],"r");
         std::string username;
    
         // Der Wert von "info_string" sei Das|ist|ein|Test
         while(fgets(info_string,sizeof(info_string),__f_userinfo))
              {
                std::string out = explode("|",info_string,1);
              }
    
         fclose(__f_userinfo);
    

    So ich habe via "cout" getestet ob auch wirklich das richtige Ausgelesen wird.
    Positiv.
    Wenn ihr jetzt sagt das liegt daran dass info_string ein char pointer ist
    und nicht std::string, nein das ist es nicht es funktiert beides.
    Aber wo liegt der fehler?



  • Ich muss noch einen wichtigen Nachtrag machen.

    Die funktion wird ohne fehlermeldung Compiliert bzw. zur Laufzeit ausgeführt.
    Allerdings gibt sie ein föllig wirres ergebniss zurück



  • Wenn ihr jetzt sagt das liegt daran dass info_string ein char pointer ist

    Genau das sage ich aber, du hast nämlich überhaupt keinen Speicher reserviert für info_string! sizeof(info_string) ist zumindest bei mir 4, weil ein Zeiger halt 4 Bytes groß ist! Entweder du machst sowas:

    char info_string[100];
    

    oder du beschäftigst dich mit C++ Dateihandling, was für dich wesentlich angenehmer sein sollte, da du dann weiterhin mit std::string arbeiten kannst!
    Siehe FAQ über Ströme!



  • Ah!
    Vielen dank das wars!
    Jo warscheinlich hast du recht und ich sollte auf streams umsteigen...
    Hm naja muss dazu meine c++ literatur zu rate ziehen 😃
    Dank nochmal!


Anmelden zum Antworten