Ganze zeile einer Datei überschreiben



  • hallo
    ich versuche in einer Datei eine bestimmte zeile mit folgendem code zu überschreiben:

    // gehe zu der passenden zeile...
    	//zur vereinfachung soll einfach 'test' angefügt werden
    	fprintf(file, "Active=test\n");
    

    wenn in der datei zuvor

    ...
    Active=default
    

    stand, steht nach dem aufruf von fprintf folgendes:

    ...
    Active=test
    lt
    

    wie kann ich nun verhindern, dass einige zeichen des alten zeilen-textes (in diesem fall "lt") vorhanden bleiben? oder gibt es eine funktion, mit der ich zuerst die zeile vollständig löschen kann?



  • Du kannst die ganze Zeile einlesen, verändern und neu schreiben.

    Angemerkt, dass du hier im C++ Forum bist, würde ich dir ifstream empfehlen:
    http://www.cplusplus.com/reference/iostream/ifstream/



  • Das Problem ist, dass Deine neue Zeile eine andere Länge haben soll als Deine alte. Da wird dir nicht viel anderes übrig bleiben als alle nachfolgenden Zeichen entsprechend zu verschieben.



  • lies einfach de datei zeilenweise in einen vector doer ähnlichem und speicher den vector danach wiederkomplelt in deine datei die geleert wurde



  • gibt es auch für fstream keine funktion um eine zeile vollständig zu löschen? oder eine, die den dateiinhalt ab der cursor-position löscht?
    alles auslesen und neu schreiben ist ein wenig umständlich, da die dateien teilweise über 1000 zeilen haben.. (zumindest für den computer :p)


  • Administrator

    zar schrieb:

    gibt es auch für fstream keine funktion um eine zeile vollständig zu löschen? oder eine, die den dateiinhalt ab der cursor-position löscht?
    alles auslesen und neu schreiben ist ein wenig umständlich, da die dateien teilweise über 1000 zeilen haben.. (zumindest für den computer :p)

    --->

    Wirdbald schrieb:

    Das Problem ist, dass Deine neue Zeile eine andere Länge haben soll als Deine alte. Da wird dir nicht viel anderes übrig bleiben als alle nachfolgenden Zeichen entsprechend zu verschieben.

    Es gibt also keine Möglichkeit, eine Zeile zu löschen. Die Bytes müssen verschoben werden, da gibt es keinen Weg dran vorbei. Und 1000 Zeilen sind für einen Computer heutzutage richtig mickrig. Das geht doch in ein paar Millisekunden :p

    Du kannst natürlich eine Zeile mit Whitespaces oder sowas füllen, statt sie zu löschen. Aber das wäre etwas billig 🙂
    Oder wenn du genau eine gerade Anzahl Zeichen in der Zeile hast, kannst du 50% davon mit dem Zeichen 0x20 füllen und die anderen dahinter mit dem Zeichen 0x08. Setzt natürlich voraus, dass du einen Zeichensatz verwendest, welcher als Teilmenge die ASCII Zeichen besitzt 😉

    Grüssli



  • Was das Zeilen löschen angeht ist es so wie ich geschrieben habe: Du musst die nachfolgenden Zeichen verschieben. Um das nicht mehr benötigte Ende einer Datei dann zu entfernen gibt es schon Möglichkeiten, wenn ich auch nicht weiß, ob es da etwas standardkompatibles gibt. Die fstream - Klasse besitzt so etwas jedenfalls glaube ich nicht. Ich habe diese zwei (C-)Funktionen hier gefunden aber nicht ausprobiert:

    #include <unistd.h>
    int chsize(int fildes, long size); 
    
    #include <io.h>
    int _chsize(int handle, long size);
    

    Da musst Du mal ein wenig googlen oder eben doch eine temporäre Datei benutzen.



  • Denk dran das es keine Zeilen gibt. Dein Editor gaukelt dir das nur vor. Ein Zeilenumbruch ist ein Zeichen wie jedes andere auch. Wenn man daran denkt ist es auch schnell ersichtlich warum nicht einfach eine Zeile abgeschnitten werden kann. Eine Datei kann keine Löcher haben, daher muss dieses gefüllt werden. Entweder mit wertlosen Zeichen (je nach Verwendungszweck gibt es evtl. welche) oder eben alles was dahinter kommt verschieben.

    Das gleiche Problem wirst du haben, wenn du einen längeren Text reinschreiben willst.


Anmelden zum Antworten