fstream-Problem



  • Ich habe eine normale txt-file der Form:

    #2009-Nov-28
     15:24:26
    

    Normalerweise soll die Position des # ermittelt werden und später verwendet um zu prüfen ob es immernoch der Gleiche Tag ist. Aber ich komme immer auf die Falsche Position und es wird immer der Falsche Output erzeugt.

    #2009-Nov-28
     15:35:03
    #2009-Nov-28
     15:35:04
    

    anstatt von:

    #2009-Nov-28
     15:35:03
     15:35:04
    

    Hier mal der kritische Code... habe auch schon konstrukte mit getline() gehabt doch da hat es teilweise einfach die # übersprungen...

    std::ifstream gamma;
      r_file.open("test.txt");
    
      if(r_file.is_open()){
        std::size_t dummy = std::string::npos;
        char c;
    
        while(!r_file.eof()){
          c = r_file.get();
          if('#'== c){
            dummy = r_file.tellg();
            //std::cout << dummy2 << ":" << c << std::endl;
          }
        }
    [...]
    

    Mit der cout zeile kommen eig immer ergebnisse wie : "#:5", die ja eigentlich "c:0" sein müssten.



  • Ich denk es muss irgendwie an den .tellg() methoden liegen... hat jmd eine Lösung parat? Es dürfte ja eigentlich nicht passieren das durch den Aufruf von Get die interne Position des Get-Pointers um 7 verschiebt... oder?



  • Wie wäre es mal, dafür schlicht ANSI-C zu verwenden?
    Du brauchst dann zwei Strings, einen für die Eingabe und einen für die aufbereitete Ausgabe (ohne #). Lässt sich einfach in einer Schleife erledigen mit Einfügen des Nullzeichens '\0' versteht sich. Die Länge des Eingabestrings bekommst du mit len = strlen(Eingabestring). Ist eine einfache Angelegenheit. Dafür braucht man nicht die String-Klasse von C++.



  • Ich weiß nicht ob das wirklich die Lösung ist, da ich das letzte vorkommen eines bestimmten, formatierten Teil einer Datei haben will, um zu sehen ob dieser noch gültig ist oder ein neuer eingefügt werden muss. Die Eingabe ist in diesem Fall nicht von mir sondern von Boost "gemacht".



  • Das .TXT im Namen der Datei deutet doch darauf hin, dass es sich um eine reine
    Textdatei nach ASCII handelt. Wenn dem so ist, hier mein Vorschlag:

    ifstram    datei;
    char       zeile[80],ausgabe[80],zeichen;
    int        len,i;
    ....
    datei.open("test.txt");
    while(!datei.eof())
    {
       datei.getline(zeile,sizeof(zeile));  // die einzelnen Zeilen der Datei
       len = strlen(zeile);
       for(i=0;i<len;i++)
       {
          zeichen=zeile[i];                 // die einzelnen Zeichen einer Zeile
          ....                              // hier die Ausgabe aufbereiten
       } 
       ....
    }
    

    So sollte es laufen. Natürlich geht das mit pointern in der for-Schleife noch etwas eleganter.
    Achtung: An die Ausgabe das Nullzeichen '\0' anhängen!


Anmelden zum Antworten