Kleines Proböem mit Datei schreiben....
-
Hallo...
Ich würde gerne eine Datei (txt) wenn sie eine bestimmte größe ereicht hat, von vorne neu überschreiben. also nicht löschen sonder wieder die erste, zweite,dritte usw. zeile beschreiben können. Das mit der größe bekomm ich hin nur bis jetzt lösche ich dann immer die datei und die älteren daten gehen verloren:(kann mir da jemand helfen?
Danke und schöne Grüße
Microtron
-
Du willst es also folgendermaßen haben. Sagen wir mal die Datei darf nur 10 Zeichen beinhalten.
1. Dateiinhalt mit 10 Zeichen
abcdefghij
2. Dateiinhalt bei dem weitere 2 Zeichen hinzugefügt wurden
klcdefghij
Ist das so richtig?
Wenn ja dann liegt es ganz einfach am Zugriffsmodus. Du verwendest jetzt wahrscheinlich nur w zum Schreiben. Wenn du es so willst, wie oben beschrieben, dann musst du r+ (lesen und schreiben) verwenden.
-
ja... so ist es richtig... halt nur zeilen abhängig aber das dürfte kein problem sein! im moment öffne ich mit "a", also hinten dran schreiben und will dann halt wieder die erste zeile überschreiben!
bin mit dateien leider nicht sehr fit, sorry
-
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
ghidas 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
ghiJetzt 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