Zeile loeschen bzw. ueberschreiben in einer Text-Datei.



  • Hallo Forum,

    folgendes Problem,
    es wird eine Text-Datei geoeffnet und nach einen string gesucht.

    if ((fp = fopen(cfgconv,"r+at")) == NULL) return;
       while (!feof(fp))
       {
         *call = '\0';
         fscanf(fp,"%s%s",&(*call),&(*nick));
           if (strcmp(cp->name,call) == FALSE)
    

    String gefunden in Zeile 10 (nur mal als Beispiel), soll auch in
    Zeile 10 wieder aktualisiert werden.

    /* Feststellen in welcher Zeile wir sind. */
                   x = ftell(fp);
                   /* Wir gehen zu der gesuchten Zeile. */
                   fseek(fp,x,0);
                   /* Schreibe neue Daten in die Zeile. */
                   fprintf(fp,"%s %s",cp->name,cp->nickname);
    

    Fast alles Super, leider werden die neuen daten an den alten angehaengt.
    Hier ist die Text-Datei:

    atd233 alkan
    dad213 chris
    daa531 olli
    ol2rie olliol2rie oliver
    dd1br brecher
    lpz1kt kevin
    dok1st stefan

    Soll aber am ende so aussehen:

    atd233 alkan
    dad213 chris
    daa531 olli
    ol2rie oliver
    dd1br brecher
    lpz1kt kevin
    dok1st stefan

    Welche funktion fehlt noch?

    mfg Olli.



  • Öffne mal die Datei so:

    fopen(cfgconv,"r+t")
    

    Ich sehe aber da jetzt ein Problem.
    Wenn der Ersetzen-String länder ist als der Suchstring,
    werden Folgedaten überschrieben. Ist der Ersetzen-String
    kürzer, bleiben Teile des Suchstrings bestehen.

    Also am besten die komplette Datei puffern und die Such-
    und Ersetzenoperationen im Speicher durchführen.



  • Also am besten die komplette Datei puffern und die Such-
    und Ersetzenoperationen im Speicher durchführen.

    und zum schluss datei neuschreiben lassen mit den Updates ?
    Wenn ja ist es ziemlich aufwenig denk ich mal.

    Brauche nur eine funktion die mir die Zeile vorher loeschen soll, so dass
    ich dann nur noch den neuen Eintrag rein kopiere.

    mfg Olli.



  • Hermann hat recht, mit deinr Lösung bekommst du Probleme wenn die Stringlänge beim Update sich ändert.
    Wenn du nicht auf seinen Vorschlag mit der Bufferung eingehen willst, kannst du auch die Datei so definieren,
    das jede Zeile die gleiche Länge hat, dann kannst du einzelne Zeilen leicht austauschen hier zum Beispiel
    ist eine Record 24 Zeichen lang 10 Zeichen für den ersten Item und 14 Zeichen für den zweiten String

    atd233.... alkan........
    dad213.... chris........
    daa531.... olli.........
    ol2rie.... olli.........
    dd1br..... brecher......
    lpz1kt.... kevin........
    dok1st.... stefan maier.



  • dann kannst du einzelne Zeilen leicht austauschen

    Genau das ist ja das Problem mit dem austauschen.
    Wie geht das nun ?!

    mfg Olli.



  • Falls jetzt die Zeilen alle gleich lang sind
    positionierst du den Filepointer auf den anfang der gewünschten Zeile
    und schreibst die neuen Daten hinein. Um eine zeile zu "löschen", sollte
    man sie mit einem leerinhalt überschreiben.
    Um im Beispiel zu bleiben Recordlänge =24 Zeichen.

    - File öffnen (fp=fopen( "file", "w+" );)
    - Positionieren (fseek( fp, 24L*line, SEEK_SET);) // Zeile die ausgetauscht werden soll achtung
    - austauschen
    - File schließen

    Beispiel:

    int  ExchangeData(char *file,//Filename
    char *text, // Neuer Inhalt
    int line)  // Zeile die ausgetauscht werden soll
    {
       FILE *fp;
       char line[80+1];
       if(NULL==(fp = fopen( file, "w+" )))
        {
         printf( "The file %s can´t be opened\n",file );
         return -1;
         }
       else
       {
          if( 0 != fseek( fp, 24L*(long int)line, SEEK_SET))
            {
             printf( "ERROR Fseek failed" );
             return -2;
             }
          else
          {
             sprintf( line,"%24.24s",text );
             fputs( line, fp );
          }
          fclose( fp );
       }
    return 0;
    }
    

    😉


Anmelden zum Antworten