An bestimmte Position im Textfile gehen

Hallo,

ich muß in einer (Text-)Datei an eine bestimmte Position gehen
(z.B. Zeile 62, 43. Buchstabe).
Gibt es da einen Befehl für?
Oder muß ich 62 mal die Zeile einlesen und in der Zeile dann 43 Zeichen lesen??
Das muß doch einfacher gehen.

Und wie kann ich dann an die Stelle etwas einfügen, ohne das etwas anderes überschrieben wird?

bis dann,
Jan

Hallo Jan

ich muß in einer (Text-)Datei an eine bestimmte Position gehen
(z.B. Zeile 62, 43. Buchstabe).
Gibt es da einen Befehl für?

Soweit ich weiß nicht.

Oder muß ich 62 mal die Zeile einlesen und in der Zeile dann
43 Zeichen lesen??

Ich glaube da wird dir nicht viel anderes übrig bleiben. Aber du kannst dir das ja in 'ne eigene Funktion packen, dann hast du später das Problem nicht mehr :smile:

Das muß doch einfacher gehen.

s.o.

Und wie kann ich dann an die Stelle etwas einfügen, ohne das
etwas anderes überschrieben wird?

Einfügen in dem Sinne, wie du es von einer Textverarbeitung kennst, geht definitiv nicht. Zumindest nicht in der selben Datei. Dazu mußt du eine zweite, temporäre Datei öffnen, in der du erst den anfang der ersten Datei schreibst, dann den einzufügenden Teil und dann den Rest der alten Datei. Die alte Datei kannst du dann löschen und die neue umbenennen.

Diese Prozedur klappt quasi immer. egal ob du einen Teil überschreiben oder löschen willst oder ob du etwas einfügst.

Wenn du die Datei im binär-Modus geöffnet hast, kannst du (so weit ich weiß) mit der Funktion fputc auch in der Mitte der Datei zeichenweise überschreiben. Unter Windows mußt du aber auf die Zeilenschaltungen achten, da Microsoft für eine Zeilenschaltung 2 Byte in die Datei schreibt (anders als unter Unix/Linux).

Gruss Jens

Moin,

ich muß in einer (Text-)Datei an eine bestimmte Position gehen
(z.B. Zeile 62, 43. Buchstabe).
Gibt es da einen Befehl für?

AFAIK nicht.

Oder muß ich 62 mal die Zeile einlesen und in der Zeile dann
43 Zeichen lesen??
Das muß doch einfacher gehen.

Ein wenig: Lies alles binär ein und suche das 43. Zeichen nach dem 61. ‚\n‘.

Und wie kann ich dann an die Stelle etwas einfügen, ohne das
etwas anderes überschrieben wird?

Den Buffer ändern und alles wieder in die Datei schreiben.

Thorsten

Hi,

AFAIK nicht.

Schade!

Den Buffer ändern und alles wieder in die Datei schreiben.

Hä? Was heißt das?

Jan

Thorsten

Moin,

Den Buffer ändern und alles wieder in die Datei schreiben.

Hä? Was heißt das?

Du ermittelst die Größe der Datei, reservierst entsprechend viel Speicher als Buffer und liest die gesamte Datei in diesen Buffer ein. Jetzt kannst Du in diesem Buffer nach Herzenslust arbeiten (denk daran, daß sich die Größe ändern kann) und am Ende alles wieder in die Datei schreiben.

Fragen zu Details?

Thorsten

Moin,

Den Buffer ändern und alles wieder in die Datei schreiben.

Hä? Was heißt das?

Du ermittelst die Größe der Datei, reservierst entsprechend
viel Speicher als Buffer und liest die gesamte Datei in diesen
Buffer ein. Jetzt kannst Du in diesem Buffer nach Herzenslust
arbeiten (denk daran, daß sich die Größe ändern kann) und am
Ende alles wieder in die Datei schreiben.

Fragen zu Details?

Oh Ja!
ungefähr zu allen.

es hört sich, ehrlich gesagt etwas kompliziert an…

Jan

Moin,

Du ermittelst die Größe der Datei, reservierst entsprechend
viel Speicher als Buffer und liest die gesamte Datei in diesen
Buffer ein. Jetzt kannst Du in diesem Buffer nach Herzenslust
arbeiten (denk daran, daß sich die Größe ändern kann) und am
Ende alles wieder in die Datei schreiben.

Fragen zu Details?

es hört sich, ehrlich gesagt etwas kompliziert an…

Tja, ein wenig Arbeit wirst Du investieren müssen.
Was soll denn das Endprodukt sein? Vermutlich geht es mit Perl oder sed(1) viel leichter.

Ansonsten nochmal genauer. Man möge mich unterbrechen, wenn ich etwas vergesse.

  1. Du ermittelst die Größe der Datei. Die steht in irgendeinem struct, läßt sich aber auch herausbekommen, indem Du Dateizeiger von Ende und Anfang subtrahierst.
  2. Du reservierst mit calloc() eine entsprechende Menge Speicher, den Buffer.
  3. Du liest die Datei binär ein und schreibst sie in den Buffer.
  4. Jetzt kannst Du im Buffer arbeiten, zB. nach '\n’s suchen. Wenn Du Änderungen vornehmen willst, mußt Du daran denken, daß Du evtl. neuen Speicher brauchst.
  5. Wenn der Buffer so ist, wie Du ihn haben willst, öffnest Du die Datei erneut und schreibst alles rein. Backup ist optional.

Das Ganze ist eine sehr einfache Vorgehensweise, die man sicherlich verbessern könnte. Besonders bei großen Datein ist Vorsicht geboten.

Thorsten