C Löschen des letzten n Zeichen aus der Datei
Ich löschen müssen, um die letzten n Zeichen aus einer Datei mit C-code. Bei fist ich versuchte, verwenden '\b', aber es gibt einen Segmentation Fault. Ich habe gesehen, interessante Antworten auf ähnliche Fragen hier und hier, aber ich würde es vorziehen, zu verwenden mmap
Funktion, um dies zu tun, wenn es möglich ist. Ich weiß, es könnte einfacher sein, um die Datei kürzen durch erstellen einer temp-Datei, und schreiben chars die temp bis auf einige offset der original-Datei. Das problem ist, dass ich nicht scheinen, um zu verstehen, wie mmap
Funktion, um dies zu tun, nicht erkennen kann, welche Parameter ich übergeben muss um die Funktion, speziell address
, length
und offset
. Von dem, was ich gelesen habe, sollte ich verwenden MAP_SHARED
im flags
und PROT_READ|PROT_WRITE
im protect
.
Definition der Funktion sagt:
void * mmap (void *address, size_t length, int protect, int flags, int filedes, off_t offset)
Hier ist mein main:
int main(int argc, char * argv[])
{
FILE * InputFile;
off_t position;
int charsToDelete;
if ((InputFile = fopen(argv[1],"r+")) == NULL)
{
printf("tdes: file not found: %s\n",argv[1]);
}
else
{
charsToDelete = 5;
fseeko(InputFile,-charsToDelete,SEEK_END);
position = ftello(InputFile);
printf("Pos: %d\n",(int)position);
int i;
//for(i = 0;i < charsToDelete;i++)
//{
// putc(InputFile,'\b');
//}
}
fclose(InputFile);
return 0;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht:
wie zum Beispiel:
ftruncate(fileno(InputFile), position);
wie Sie vorgeschlagen und es hat Super geklappt. Danke!mmap
- Methode) zum löschen des letzten Zeichen in eine Datei geschrieben (wie das, wasBACKSPACE
nicht in einem terminal-Fenster. ++1Lesen Sie alle, aber
n
bytes aus der Datei und schreiben in eine temporäre Datei, schließen Sie die ursprüngliche Datei, benennen Sie die temporäre Datei als original-Datei.Oder z.B.
truncate
oder ähnliche Funktion, wenn Sie es haben.Auch, Fehler beim öffnen der Datei nicht haben, zu sein, dass es nicht gefunden werden kann, sollten Sie überprüfen,
errno
auf Fehler, um zu sehen, was der Fehler ist. Verwenden Sie z.B.strerror
erhalten Sie einen druckbaren string aus dem Fehler-code.Leider
mmap
nicht zulassen, dass Sie ändern der Größe des zugrunde liegenden file-Objekt.Stattdessen würde ich empfehlen, einfach abschneiden Ihrer Datei, verwenden Sie so etwas wie dieses:
mmap
für, die. In welchen Fällen die Verwendung dieser Funktion wäre eine gute Idee? Wenn ich brauche, um einige Charakter-Verschiebung in der Datei? Wie bei der Verwendung vonmemmove
?mmap
Karten-Datei-Inhalt in den Speicher (man kann die Zeiger mit bekannten memory block size), die Sie entfernen müssen, mapping, bevor ändern Sie die Dateigröße durch schreiben von weiteren Daten oder durch die Nutzungtruncate
. Wenn Sie möchten Bearbeiten der Datei-Inhalte schnellmmap
ist eine gute und schnelle Methode. Aber wenn Sie benötigen, zu ändern, Datei-Größe, ändern Sie es im Voraus, und verwenden Sie dannmmap
.