Kleines Proböem mit Datei schreiben....



  • Macht nichts. Übung macht den Meister und man wächst mit neuen Aufgaben 😉



  • hab es aber immer noch nicht geschafft 🙂
    also ein kleines beispiel!

    erste zeile

    abc

    zweite

    def

    dritte

    ghi

    und jetzt ist die datei voll und ich hätte gerne als nächstes

    jkl
    def
    ghi

    das ist mal ne beschreibung, mal schauen ob du damit was anfangen kannst 🙂



  • Theoretisch würde ich sagen das ginge so (angenommen die Datei ist schon voll und die ersten 3 Zeichen werden durch was anderes ersetzt):

    FILE *fp;
    
    fp=fopen("datei.txt", "r+");
    
    if(fp)
    {
       fprintf(fp, "jkl");
    
       fclose(fp);
    }
    

    Praktisch hab ich sowas noch nie gemacht :(.

    Ich lese Dateien normalerweise immer erst komplett in den Arbeitsspeicher ein, ändere dort alles und schreibe dann die komplette Datei neu.

    Möglicherweise musst du vor dem Schreiben bei meinem Beispiel noch den Dateizeiger auf den Anfang setzen, wobei das aber schon automatisch so sein sollte (schon vom Lesen her gesehen ;)).



  • ja das mit dem arbeitsspeicher ist so ne sache... das ganze läuft auf einem mikrocontroller, da ist nicht wirklich viel davon da 🙂

    Also die erste zeile kann ich damit uper überschreiben, aber dann hängts wieder 😞

    Was ist denn wenn die nächsten daten kommen und ich dann die 2...3...4...5.. zeile wieder überschreiben will. und dann wieder vorne anfangen 🙂

    Mit r+ überschreibt er immer die erste zeile ich kann ihm aber nicht sagen das jett die zweite dran ist 😞

    noch eine idee?

    kann ich da was mit "fgetpos() und fsetpos()" machen?



  • Ja damit könntest du was machen, aber auch einfach mit fgetc(). Da du die Datei zum Lesen und Schreiben geöffnet hast und der Dateizeiger auch immer der gleiche ist ;), kannst du das gut ausnützen. Wenn du z. b. in der zweiten Zeile was schreiben willst, dann musst du zuerst mit fgetc() solange Zeichen einlesen bis du ein \n gelesen hast. Dann steht dein Dateizeiger beim 1. Zeichen in der zweiten Zeile und kannst jetzt wieder zum Schreiben anfangen.

    PS: Wenn du genau weißt wie lange deine Zeilen sind, also du die Position deiner Zeilen genau weißt in der Datei, dann gehts natürlich mit fseek() leichter. Beim Schreiben musst du eh aufpassen, dass du nicht über die Zeile hinausschreibst, denn dann überschreibst du das \n und auch die Zeichen die dann danach folgen.



  • kannst du mir mal ein beispiel geben wie ich ihn mit fgetc() in die erste zeile und dann die zweite bekomme? weiß nicht so genau wie du das meinst 🙂
    gruß



  • In der 1. Zeile bist du sowiso automatisch.
    Machen wir den Fall mal anders. Du hast eine Datei mit folgenden Zeilen:

    abc
    def
    ghi

    Jetzt willst du die zweite Zeile ändern durch jkl:
    Du weißt genau wieviele Zeichen in den einzelnen Zeilen stehen (hier also jeweils drei + Zeilenumbruch)

    FILE *fp;
    
    fp = fopen("datei.txt", "r+");
    
    if(fp)
    {
       //Setze Dateizeiger auf die 4. Position in der Datei (1. Zeichen der zweiten Zeile)
       fseek(fp, 4, SEEK_SET); 
    
       fprintf(fp, "jkl");
    
       fclose(fp);
    }
    

    Wenn du allerdings nicht weißt wie lange die Zeilen sind und du Gefahr läufst über die Zeile hinauszuschreiben (also z. B. wenn du jklm schreiben würdest), dann führt kein Weg daran vorbei die ganze Datei einzulesen. Wenn du zu wenig Speicher für die ganze Datei hast, dann müsstest du die Datei stückchenweise einlesen und ändern, also z. B. immer nur 1024 Byte einlesen und in diesen 1024 Bytes was ändern, dann das wieder zurückschreiben und das nächste "Packet" machen.

    Wobei mir grad noch einfällt, dass du auch über eine Tempdatei arbeiten könntest, wenn du genug Plattenplatz bzw. Flashspeicher zur Verfügung hast.



  • ja klasse...das hilft mir richtig weiter!
    Nur... ist der zeilenumbruch denn kein zeichen? denn du sagst ja gleich pos 4???
    Das mit dem Speicher ist wirklichein kleines problem... ich habe teile vom RAM zu einem Laufwerk gemacht denn den Flash kann ich ja nur begrenzt beschreiben von der haltbarkeit her. nur im falle eine stromausfalls schreibt er die datei auf den Flash!
    ich versuche es mal mit deinen ideen... gefällt mir gut 🙂



  • Ja richtig, der Zeilenumbruch ist auch ein Zeichen (\n; ASCII-Code: 10).



  • ich bedanke mich....
    hat alles geklappt, das programm läuft!
    Spätestens wenn neue fragen entstehe mald ich mich wieder 🙂


Anmelden zum Antworten