2016-03-23 8 views
-1

Ich arbeite an C in meiner Universität, ich bin am Anfang arbeiten mit Puffern und diese Funktion so apolagize mein Mangel an Wissen, dass ich zeigen könnte . Ich muss dieses Projekt mit lseek(), write() und read() machen. Ich wollte eine Datei lesen, und jeden Buchstaben, den ich finde, würde ich in '?' Mein Code so weit ist:Problem beim Arbeiten mit Datei mit lseek() lesen() und schreiben()

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main() { 
    int fd = open("problema4file", O_RDWR); 
    int fptr = lseek(fd, (off_t)(-1), SEEK_END); 
    char buffer; 
    while(fptr!=-1){ 
    read(fd, &buffer, 1); 
    char changeTo = '?'; 
    if(buffer == 'a'){ 
     write(fd, &changeTo,1); 
    } 
    fptr=lseek(fd, (off_t)(-2), SEEK_CUR); 
    } 
    close(fd); 
} 

Aber dies ist die erste geändert ‚a‘ (zuletzt, weil ich vom Ende beginnen) und nicht mehr. Es hört auf sich zu ändern. Ach und es ändert nicht das 'a', ändert den Brief danach, aber das hat mit den Pufferbewegungen zu tun oder? Ich könnte später darüber nachdenken .. Ich wollte nur wissen, warum das nicht die ganze Datei liest und alles ändert, es hört bei der ersten Feststellung auf.

+2

Veröffentlichung den Text eher als ein Bild von Text nützlicher ist (Ausschneiden/Einfügen, Suchen) – chux

+0

http://stackoverflow.com/questions/36185820/lseek-doesnt-do-what-its-supposed –

+1

Eine Frage ist erforderlich, um den Code ** in ** die Frage selbst zu haben! – Olaf

Antwort

0

Sie lesen ein Byte und schreiben dann ein Byte, ohne den Offset innerhalb der Datei neu zu positionieren. Dann suchst du 2 Positionen rückwärts.

Notieren Sie, was Sie auf einem Stück Papier tun, um zu verstehen, was falsch ist.

P.S. Das letzte Zeile - Sie sollten Sie von jetzt alles tun, schreiben, bis Sie Code schreiben Sie nicht mehr;)

you seek to EOF - 1, you're before the last byte in the file. 
you read a byte, you're now at EOF. 
Then you write a byte (you've extended the file by one), you're positioned again @ EOF. 
you now seek backwards 2 bytes, which puts you back to where you began. 
+0

Ich habe immer noch nicht die Fähigkeit, wirklich zu verstehen, was vor sich geht. Ich folge Beispielen und versuche es zu tun. –

+0

lesen Sie das Ende meiner Antwort (die 'code' Teil) – KevinDTimm

+0

Oh ok, ich folge .. Also, wie kann ich die ganze Datei lesen? –