Dateizeiger an den Anfang setzten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Dateizeiger an den Anfang setzten

Beitrag von Columbus » 28.03.2006 15:09:39

Hallo Liste,
heute habe ich das Problem, daß ich ein Progrämmschen schreiben soll, das Byteweise eine Datei invertiert in eine andere schreiben soll. Also in der Zieldatei steht der inverse Text der Quelldatei.
Dazu lese ich aus der Quelldatei ein Byte und schreibe das in die Zieldatei. Dann setze ich den Dateizeiger zurück an den Anfang und lese und schreibe das nächste Zeichen. Das Problem im Moment, es wird das zuvor geschriebene Zeichen in der Zieldatei überschrieben. Die Datei bleibt auf diese Art immer nur ein Byte groß und das ist nicht das was ich will.

Hier ist der Codeausschnitt:

Code: Alles auswählen

Öffnen der ZielDatei
   if ( ( ziel_datei = open ( argv[2], O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR ) ) == -1 )
   {
      printf ( "Ziel-Datei existiert schon ! Kann nicht ueberschrieben werden ! \n" );
      exit ( -1 );
   }

while ( ( anzahl_bytes = read ( quell_datei, buffer, BYTEZAHL ) ) > 0 )
{
  anzahl_bytes = write ( ziel_datei, buffer , BYTEZAHL );
  if ( anzahl_bytes == -1 )
  { 
      printf ( "Fehler beim schreiben!\n" );
      exit ( -1 );
  }
  if ( ( rueck_gabe = lseek ( ziel_datei, 0, SEEK_SET ) ) == -1 )
  {
     printf ( "Fehler beim Zuruecksetzen des Dateizeigers ! \n" );
     exit ( -1 );
  }
 printf ( "Uebergebens Zeichen: %c \n", buffer[0] );
}
Wenn ich nun beim öffnen der Datei die konstante O_APPEND hinzufüge schreibt das Programm sowiso nur an das Ende der Datei (wie es ja auch in der Doku steht), ich wüsste nicht welche Konstante hier noch passen sollte.
UND ich möchte (muß) es unbedingt mit lseek machen! Nicht mit rewind oder ähnlichen Funktionen!!

Hat jemand von Euch eine Idee?

Vielen Dank

Gruss Christian
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

Benutzeravatar
h-man
Beiträge: 745
Registriert: 05.02.2003 13:10:08
Wohnort: Berlin
Kontaktdaten:

Re: Dateizeiger an den Anfang setzten

Beitrag von h-man » 28.03.2006 16:14:04

Columbus hat geschrieben:Hallo Liste,
heute habe ich das Problem, daß ich ein Progrämmschen schreiben soll, das Byteweise eine Datei invertiert in eine andere schreiben soll. Also in der Zieldatei steht der inverse Text der Quelldatei.
Dazu lese ich aus der Quelldatei ein Byte und schreibe das in die Zieldatei. Dann setze ich den Dateizeiger zurück an den Anfang und lese und schreibe das nächste Zeichen. ...
...
...
Hat jemand von Euch eine Idee?

Vielen Dank

Gruss Christian
bist du verwirrt? lass einfach das mit dem lseek, dann geht es.

außerdem solltest du zwischen "byte lesen" und "byte schreiben" noch das byte invertieren:

- byte lesen. QUELLE
- byte invertieren.
- byte schreiben. ZIEL

dann ist die aufgabenstellung doch erschlagen, so wie du sie beschrieben hast. oder ist deine beschreibung missverständlich?
Nieder mit der Schwerkraft.

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 28.03.2006 16:18:55

dann ist die aufgabenstellung doch erschlagen, so wie du sie beschrieben hast. oder ist deine beschreibung missverständlich?
Ja offensichtlich. Mit invertieren meine ich den Text aus der Quelldatei rückwärts in die Zieldatei. Aus "Hallo ich bin der Columbus" wird "submuloC red nib hci ollaH".

Gruss Christian
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 28.03.2006 16:32:29

mach doch das lseek beim Lesen, dann kannst du sequentiell schreiben

Pseudocode:

Code: Alles auswählen

  epos = lseek(sh,0,SEEK_END);
  currpos = epos / bufflen * bufflen ;
  while(currpos>=0) {
    lseek(sh,currpos,SEEK_SET);
    rb=read(sh,buffer,bufflen);
    for (i=0; i<rb/2; i++) {
      char c=buffer[i];
      buffer[i]=buffer[rb-i-1];
      buffer[rb-i-1]=c;
    }
    wb=write(th,buffer,rb);
    currpos-=bufflen;
  }

Gruß
gms

Antworten